如何按指定Locale重新排列Java的DayOfWeek枚举元素?
按指定Locale重新排列DayOfWeek枚举顺序
我们可通过Locale软编码确定一周的第一天,示例代码如下:
DayOfWeek firstDayOfWeek = WeekFields.of( Locale.US ).getFirstDayOfWeek() ; // Sunday-Saturday.
此外,Java提供了定义星期的内置枚举DayOfWeek:
DayOfWeek[] dows = DayOfWeek.values() ; // Monday-Sunday
请问如何创建按指定Locale定义顺序重新排列的DayOfWeek枚举对象数组或列表?
目标是按照特定Locale代表的文化规范,展示一周七天的顺序。
可以借助WeekFields获取指定Locale对应的一周起始日,以此为起点循环生成符合当地规范的星期顺序,具体实现如下:
生成有序列表
import java.time.DayOfWeek; import java.time.temporal.WeekFields; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class LocalizedWeekDays { public static List<DayOfWeek> getLocalizedWeekDays(Locale locale) { WeekFields weekFields = WeekFields.of(locale); DayOfWeek firstDay = weekFields.getFirstDayOfWeek(); List<DayOfWeek> localizedDays = new ArrayList<>(7); DayOfWeek currentDay = firstDay; for (int i = 0; i < 7; i++) { localizedDays.add(currentDay); currentDay = currentDay.plus(1); } return localizedDays; } public static void main(String[] args) { // 美国地区(周日为一周起始) List<DayOfWeek> usWeekDays = getLocalizedWeekDays(Locale.US); usWeekDays.forEach(System.out::println); // 输出:SUNDAY, MONDAY, ..., SATURDAY // 法国地区(周一为一周起始) List<DayOfWeek> frWeekDays = getLocalizedWeekDays(Locale.FRANCE); frWeekDays.forEach(System.out::println); // 输出:MONDAY, TUESDAY, ..., SUNDAY } }
生成有序数组
如果需要数组形式,直接将列表转换即可:
DayOfWeek[] localizedArray = getLocalizedWeekDays(locale).toArray(new DayOfWeek[0]);
原理说明
WeekFields.of(locale)会根据Locale对应的文化规则,返回该地区的星期字段定义,核心就是一周的起始日。DayOfWeek.plus(1)方法自带循环逻辑:当当前是SATURDAY时,调用plus(1)会自动返回SUNDAY,刚好适配一周的循环排列需求。
内容的提问来源于stack exchange,提问作者Basil Bourque
相关产品推荐
相关产品推荐

