有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用Locale和Gregorianalendar在Java中获得给定语言的工作日名称?

我在一个练习中遇到了一些严重的困难,我将编写一个简单的程序,它将给出一个工作日名称(而不是int值)作为输出。更重要的是,从当前日期算起,它应该是未来90天的工作日,并且应该以当地语言(丹麦语)显示

我是一个初学者,正在寻找如何做到这一点的提示

这个练习的重要部分是,我不能使用比导入的类更多的类(参见下面的代码)

我自己发现的是如何获取当前日期并将其显示为工作日(我知道它从周日开始从1开始计数),但我不知道如何强制它以本地语言将此整数显示为工作日名称

    package days01;

import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.Locale;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;

public class Dates {
   public static void main(String[] argv) {
      Calendar one = new GregorianCalendar();
      int day = one.get(Calendar.DAY_OF_WEEK);
      System.out.println(day);
   }
}

预期输出应该是从当前日期算起的一个工作日名称


共 (3) 个答案

  1. # 1 楼答案

    推荐的解决方案:java。时间

    使用Rzwitserroot回答中的第一个片段

    不鼓励的解决方法:照老师说的做

    即使我们仅限于使用Java 1.0和1.1中设计拙劣、过时已久的类,也可以比其他答案稍微优雅一些。我正在使用臭名昭著的SimpleDateFormat类。那些在Stack Overflow上认识我的人可能会因为我发布了一个使用这个类的例子而憎恨我,我接受任何反对票

        TimeZone denmark = TimeZone.getTimeZone("Europe/Copenhagen");
        Locale danish = Locale.forLanguageTag("da-DK");
        DateFormat dayOfWeekFormatter = new SimpleDateFormat("EEEE", danish);
        Calendar one = new GregorianCalendar(denmark, danish);
        one.add(Calendar.DATE, 90);
        String dayOfWeekString = dayOfWeekFormatter.format(one.getTime());
        System.out.println(dayOfWeekString);
    

    今天(10月30日星期三)运行时的输出:

    tirsdag

    (指星期二。)

    将时区传递给GregorianCalendar可以确保我们在该时区中获得今天的日期。在所有时区,日期都不一样。在本例中,我们不需要指定区域设置,它控制新的一周从哪一天开始(因为我们遵循国际标准,所以在丹麦是星期一),我们在这里不使用,所以我只是做了适当的调整

    我重复一遍:不要在生产代码中使用这个。今天,我们有了更好的java。时间,现代Java日期和时间API

  2. # 2 楼答案

    如果必须使用旧式API,那么DateFormatSymbols对于检索日期名称很有用

    import java.text.DateFormatSymbols;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.Locale;
    
    public class DayNameExample {
    
       public static String getDayName(int day, Locale locale) {
          DateFormatSymbols symbols = new DateFormatSymbols(locale);
          String[] dayNames = symbols.getWeekdays();
          return dayNames[day];
        }
    
       public static void main(String[] args) {
          Calendar c = new GregorianCalendar();
          c.add(Calendar.DAY_OF_MONTH, 90);
          int dow = c.get(Calendar.DAY_OF_WEEK);
    
          System.out.println (DayNameExample.getDayName(dow, new Locale("da", "DK") ));
    
       }
    }
    
  3. # 3 楼答案

    这是一个过时的API;你应该改用java.time。如果你的课程材料强调了这一点,那。。只是把它变成了糟糕的课程材料。这个练习显然是为了教你熟悉这个特定的API

    这个API被淘汰的众多原因之一是它令人困惑且难以使用。所以,这没用

    在新型API中,这非常非常简单:

    void go() {
        LocalDate today = LocalDate.now();
        LocalDate ninetyDaysLater = today.plusDays(90);
        DayOfWeek dayOfWeek = ninetyDaysLater.getDayOfWeek();
        Locale danish = new Locale("da", "DK");
        System.out.println(dayOfWeek.getDisplayName(TextStyle.FULL, danish));
    }
    

    在旧的里面,哦。让我们看看:

    void go() {
        Calendar c = new GregorianCalendar();
        c.add(Calendar.DAY_OF_MONTH, 90); // Why day of month? Just cuz. I mentioned this API is bad, right?
        int dow = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(weekDayInDanish(dow));
    }
    
    static String weekDayInDanish(int dow) {
        switch (dow) {
            case Calendar.MONDAY: return "Mandag";
            case Calendar.TUESDAY: return "Tirsdag";
            // the rest of the cases here
            default: throw new IllegalArgumentException("Unexpected day: " + dow);
        }
    }
    

    如果不使用新的API,你必须自己翻译,不能依赖系统为你翻译。它也都是基于int的,所以尝试调试主要是试图找出所有任意数字的含义

    坚持使用新的API,即最重要的代码片段。干净多了