是否有可能在 JodaTime 中将星期几作为仅具有星期几整数的字符串获取而不创建 DateTime 对象

Is it possible in JodaTime to get day of week as a string having only integer number of a day of week without creation of DateTime object

我有一个原始的 int 变量,可能的值从 1 到 7(实际上它是通过对 org.joda.time.DateTime 对象调用 getDayOfWeek() 接收的,然后持久化)。

现在我需要获取星期几的字符串表示形式。我可以通过创建一个新的 DateTime 对象并将星期几设置为创建的对象来实现:

LocalDateTime.now().withDayOfWeek(dayOfWeek).dayOfWeek().getAsText();

问题是:我能否在不冗余创建 LocalDateTime 对象的情况下获得相同的字符串?

Joda-Time project is now in maintenance mode, so it is advised to migrate to the java.time classes. There is a simple and easy solution with java.time for your scenario using DayOfWeek enum如下例所示:

int dayOfWeek = 1;
System.out.println(DayOfWeek.of(dayOfWeek)); // prints English all-caps, ex: MONDAY

调用 DayOfWeek::getDisplayName 生成一个字符串,其中包含您通过 Locale 对象指定的人类语言本地化的日期名称。

要在不创建 LocalDateTime 实例的情况下实现您想要的效果,您可以使用 org.joda.time.chrono.ISOChronology class 来获得对应于星期几的 org.joda.time.DateTimeField

在下面的示例中,我使用的是 org.joda.time.DateTimeConstants,它的值从星期一 (1) 到星期日 (7)。我还使用 java.util.Locale 来获取英文名称,但你可以使用任何你想要的 Locale 你问题中的代码 uses the system's default locale,在这种情况下你可以只使用 Locale.getDefault() 而不是 ):

DateTimeField dayOfWeek = ISOChronology.getInstance().dayOfWeek();

System.out.println(dayOfWeek.getAsText(DateTimeConstants.MONDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.TUESDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.WEDNESDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.THURSDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.FRIDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.SATURDAY, Locale.ENGLISH));
System.out.println(dayOfWeek.getAsText(DateTimeConstants.SUNDAY, Locale.ENGLISH));

输出为:

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday


新建JavaDate/TimeAPI

Joda-Time 处于维护模式,正在被新的 APIs 取代,所以我不建议用它开始一个新项目。即使在 joda's website 它说:"Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to java.time (JSR-310).".

如果您正在使用 Java 8,请考虑使用 new java.time API. It's easier, less bugged and less error-prone than the old APIs.

如果您使用 Java <= 7,您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. And for Android, there's the ThreeTenABP (more on how to use it ).

下面的代码适用于两者。 唯一的区别是包名称(在 Java 8 中是 java.time,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp),但是 classes 和方法 names 相同。

for(DayOfWeek dow : DayOfWeek.values()) {
    System.out.println(dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH));
}

这也会输出:

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

您还可以从 int 值获取 DayOfWeek - 从 1(星期一)到 7(星期日)- 使用 DayOfWeek.of 方法:

// 1 is Monday, 2 is Tuesday and so on, until 7 (Sunday)
System.out.println(DayOfWeek.of(1).getDisplayName(TextStyle.FULL, Locale.ENGLISH));