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

如何使用Locale和Gregorianalendar在Java中以给定语言获取工作日名称?,java,locale,simpledateformat,dayofweek,gregorian-calendar,Java,Locale,Simpledateformat,Dayofweek,Gregorian Calendar,我在一个练习中遇到了一些严重的困难,我将编写一个简单的程序,它将给出一个工作日名称,而不是一个int值作为输出。更重要的是,它应该是从当前日期算起的90天内的一个工作日,并且应该以当地语言丹麦语显示 我是一个初学者,正在寻找我应该如何做到这一点的提示 这个练习的重要部分是,我不能使用比下面代码中导入的类更多的类 我自己发现的是如何获取当前日期并将其显示为工作日我知道它从周日开始从1开始计数,但我不知道如何强制它以本地语言将此整数显示为工作日名称 package days01; impo

我在一个练习中遇到了一些严重的困难,我将编写一个简单的程序,它将给出一个工作日名称,而不是一个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);
   }
}

预期输出应该是从当前日期开始的90个工作日名称。

这是一个过时的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,即最上面的代码片段。更干净。

这是一个过时的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,即最上面的代码片段。更干净。

如果必须使用旧式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") ));

   }
}

如果必须使用旧式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") ));

   }
}
推荐的解决方案:java.time 使用rzwitserloot回答中的第一个片段

不鼓励的解决办法:照老师说的做 即使我们仅限于使用Java1.0和1.1中设计拙劣且过时很久的类,也可以比其他答案稍微优雅一些。我正在使用臭名昭著的麻烦的SimpleDataFormat类。那些知道我在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日星期三运行时的输出:

提尔斯达克

是指星期二

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

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

推荐的解决方案:java.time 使用rzwitserloot回答中的第一个片段

不鼓励的解决办法:照老师说的做 即使我们仅限于使用Java1.0和1.1中设计拙劣且过时很久的类,也可以比其他答案稍微优雅一些。我正在使用臭名昭著的麻烦的SimpleDataFormat类。那些知道我在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日星期三运行时的输出:

提尔斯达克

是指星期二

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


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

谢谢,我认为这是非常有用的。但是,我得到一个错误类型不匹配:无法在以下行从void转换为Calendar:c=c.addCalendar.DAY\u OF_MONTH,90;我不知道
这意味着什么?我是否必须将关键字void更改为其他内容?我的编辑没有提供额外的线索,请帮忙。公平地说,虽然没有人愿意,但如果你的老师坚持的话,可以说服臭名昭著的麻烦的SimpleDateFormat班用丹麦语打印一周中的几天,所以我们不需要switch语句。对于编译器错误,该行开头不应该有任何c=。请告诉您的老师,我们这里的一些人不再使用这些旧的类,并且教它们对学生不利。因为c是一个GregoriaCalendar,我们知道c.getCalendar.DAY\u of_WEEK将返回一个DAY of WEEK常量。因此,如果您在switch语句中加入所有7,那么异常将永远不会发生。然而,如果出现问题,我们会想知道,例外是一种有效的手段。如果有一天你忘了其中一个案子。或者如果以后有人调用您的方法并将0作为参数传递,而该参数不是一周中的某一天。或者将日历类型更改为一周有10天的日历。若要继续,异常将调用程序崩溃,除非您在某处捕获它。这被认为不如提供错误的输出那么糟糕。当然,这会激怒用户,但不会误导用户。我从一个丹麦人重复到另一个丹麦人:不要使用日历,它设计得很糟糕,而且已经过时很久了。如果你打算使用GregorianCalendar提交解决方案,请你自己和明年的学生一起提交现代解决方案。它永远不能从评估中扣除。请随意添加指向此堆栈溢出问题的链接,以供参考。谢谢,我认为这是非常有用的。但是,我得到一个错误类型不匹配:无法在以下行从void转换为Calendar:c=c.addCalendar.DAY\u OF_MONTH,90;我不知道这意味着什么-我必须把关键字void改成其他的吗?我的编辑没有提供额外的线索,请帮忙。公平地说,虽然没有人愿意,但如果你的老师坚持的话,可以说服臭名昭著的麻烦的SimpleDateFormat班用丹麦语打印一周中的几天,所以我们不需要switch语句。对于编译器错误,该行开头不应该有任何c=。请告诉您的老师,我们这里的一些人不再使用这些旧的类,并且教它们对学生不利。因为c是一个GregoriaCalendar,我们知道c.getCalendar.DAY\u of_WEEK将返回一个DAY of WEEK常量。因此,如果您在switch语句中加入所有7,那么异常将永远不会发生。然而,如果出现问题,我们会想知道,例外是一种有效的手段。如果有一天你忘了其中一个案子。或者如果以后有人调用您的方法并将0作为参数传递,而该参数不是一周中的某一天。或者将日历类型更改为一周有10天的日历。若要继续,异常将调用程序崩溃,除非您在某处捕获它。这被认为不如提供错误的输出那么糟糕。当然,这会激怒用户,但不会误导用户。我从一个丹麦人重复到另一个丹麦人:不要使用日历,它设计得很糟糕,而且已经过时很久了。如果你打算使用GregorianCalendar提交解决方案,请你自己和明年的学生一起提交现代解决方案。它永远不能从评估中扣除。请随意添加指向此堆栈溢出问题的链接以供参考。我建议您不要使用SimpleDataFormat、Date和GregorianCalendar。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。而是使用LocalDate和DayOfWeek,两者都来自。我建议您不要使用SimpleDateFormat、Date和GregorianCalendar。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。而是使用LocalDate和DayOfWeek,两者都来自。