【问题标题】:Get Week Number of LocalDate (Java 8) [duplicate]获取 LocalDate 的周数(Java 8)[重复]
【发布时间】:2014-11-18 16:23:41
【问题描述】:

我正在尝试使用以下格式获取完整 LocalDate 的周数:

dd.MM.yyy

我在 Java 8 Date API 中没有找到返回周数的函数,我尝试创建一个算法,但它不起作用。

【问题讨论】:

    标签: java java-8 week-number


    【解决方案1】:

    一个小警告。我还没有对此进行测试,但是查看WeekFieldsLocalDate.get 的API 文档,您应该执行以下操作:

    LocalDate date = ...;
    // Or use a specific locale, or configure your own rules
    WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
    int weekNumber = date.get(weekFields.weekOfWeekBasedYear());
    

    【讨论】:

    • 小心Locale.getDefault()。在某些地方(例如加拿大),它可以返回从星期日开始的一周。从星期一开始使用“Locale.ISO”数周。
    • 没有Locale.ISO,但是有WeekFields.ISO
    • 注意这一点非常重要。可能你想要WeekFields.ISO
    • @membersound 这取决于您是要使用 ISO 定义,还是要使用您所在地区通用的规则。
    • 确实我不知道,例如在美国,第一天可能经常是Sunday。尽管如此,如果您为欧洲客户开发应用程序,但您的系统默认本地为 en_US(开发人员经常出现这种情况!),那么如果您没有注意到这一点,您的结果将与预期不同。
    【解决方案2】:

    Mark Rotteveel 的答案几乎是正确的,这又是一个例子,在 WeekFields 类中存在潜在的混淆(类似的方法名称,但偏离了直观的民间用法)。正确的代码需要另一个字段:

    LocalDate date = LocalDate.now();
    TemporalField woy = WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear(); 
    int weekNumber = date.get(woy);
    

    另见关于此SO-post 的类似辩论,尤其是关于@kleopatra 答案的讨论和cmets。

    【讨论】:

    • 我已根据您的答案更新了我的答案。我在这里无法访问 Java 8,所以我不得不猜测(看起来我没有仔细阅读 WeekFields 类文档,因为它确实解释了这种差异。
    • @MarkRotteveel 好的,你现在有我的支持 ;-) 对我来说,“weekOfWeekBasedYear”这个名字太技术性了,而且仍然很烦人。即使是 ISO-8601 论文也没有包含这个术语(它只是使用诸如“日历周”或“星期日期”之类的术语)。
    • 小心Locale.getDefault()。在某些地方(例如加拿大),它可以返回从星期日开始的一周。从星期一开始使用“Locale.ISO”数周。
    • 没有Locale.ISO,但是有WeekFields.ISO
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2017-03-29
    • 2019-02-25
    相关资源
    最近更新 更多