我有一个代表星期几的数字(例如,直接来自常数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表示长格式)。其他解决方案仍然值得赞赏!
答案 0 :(得分:0)
我发现的更好的解决方案是:
DateFormatSymbols.getInstance(LOCALE).getWeekdays()[dayOfWeek]
或取决于格式:
DateFormatSymbols.getInstance(LOCALE).getShortWeekdays()[dayOfWeek]
使用可变格式时不是理想的解决方案,但它现在适用于我(仅使用2种格式时)。任何其他建议仍然是受欢迎的!
答案 1 :(得分:0)
如果您使用 Java 8 ,请考虑使用。它更容易,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);