如何使用Locale和GregorianCalendar在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);
}
}

预期的输出应该是从当前日期起未来的一个工作日名称90。

如果必须使用旧式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;您应该使用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。干净多了。

推荐解决方案:java.time

使用rzwitserloot的答案中的第一个片段。

令人沮丧的解决方案:照老师说的做

即使我们被限制使用Java 1.0和1.1中设计糟糕且过时已久的类,IMHO也可以比其他答案稍微优雅一些。我使用的是出了名的麻烦的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日期和时间API java.time中有了更好的功能。

最新更新