使用Java日历中的day_of_week编号获取星期几(正确语言)的用户可见文本

时间:2017-04-10 11:10:20

标签: java android format locale dayofweek

我有一个代表星期几的数字(例如,直接来自常数Calendar.MONDAY)。现在,我想让用户看到当天的可见文本(使用我的手机的默认语言环境进行正确的翻译)。我还没有Calendar个实例,只有数字!

目前我使用下面的代码,但我觉得这应该更容易,或者至少没有实例化Calendar(但我找不到方法)轻松地将day_of_week设置为Date。

private String LOCALE = Locale.getDefault();
private String FORMAT_DAY_OF_WEEK = "EEEE";

public convertDayOfWeekFromNumberToText(int dayOfWeekNumber) {
  Calendar cal = Calendar.getInstance(LOCALE);
  cal.set(Calendar.DAY_OF_WEEK, dayOfWeekNumber);
  return new SimpleDateFormat(FORMAT_DAY_OF_WEEK, LOCALE).format(cal.getTime());
}

这是检索文本的最简单方法吗?如果您想获得最佳性能,是否有更好的解决方案?

PS。如果Java7和Java8解决方案不同,请同时提供。

修改

感谢John16384 @ comments我找到了更好的解决方案(见答案)。我已将上述的util-method转换为2种不同的方法(1表示简短,1表示长格式)。其他解决方案仍然值得赞赏!

2 个答案:

答案 0 :(得分:0)

我发现的更好的解决方案是:

DateFormatSymbols.getInstance(LOCALE).getWeekdays()[dayOfWeek]

或取决于格式:

DateFormatSymbols.getInstance(LOCALE).getShortWeekdays()[dayOfWeek]

使用可变格式时不是理想的解决方案,但它现在适用于我(仅使用2种格式时)。任何其他建议仍然是受欢迎的!

答案 1 :(得分:0)

如果您使用 Java 8 ,请考虑使用Lg overriding md.。它更容易,new java.time API

如果您正在使用 Java< = 7 ,则可以使用less bugged and less error-prone than the old APIs,这是Java 8新日期/时间类的绝佳后端。对于 Android ThreeTen Backport(更多关于如何使用它ThreeTenABP)。

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

您可以使用DayOfWeek并在任何区域设置中获取相应的文字:

int dayOfWeek = 1;
// get day of week from 1 (Monday) to 7 (Sunday)
DayOfWeek dow = DayOfWeek.of(dayOfWeek);
// get value in specified locale
System.out.println(dow.getDisplayName(TextStyle.FULL, Locale.getDefault()));
System.out.println(dow.getDisplayName(TextStyle.SHORT, Locale.getDefault()));
System.out.println(dow.getDisplayName(TextStyle.NARROW, Locale.getDefault()));

假设默认语言环境为英语,则输出为:

  

周一
  周一
  中号

您可以将上面的代码更改为您需要的Locale

Calendar.DAY_OF_WEEK具有从1(星期日)到7(星期六)的值,但新API DayOfWeek使用从1(星期一)到7(星期日)的值。因此,要从一个转换为另一个,您需要调整值:

int d = calendar.get(Calendar.DAY_OF_WEEK);
// convert values for day of week
int dayOfWeek = (d - 1 == 0) ? 7 : d - 1;
// get day of week from 1 (Monday) to 7 (Sunday)
DayOfWeek dow = DayOfWeek.of(dayOfWeek);