在JavaFX中获取给定日期的周数

在JavaFX中获取给定日期的周数,java,javafx,java-8,javafx-8,Java,Javafx,Java 8,Javafx 8,我有一个javafx.scene.control.DatePicker。我想从所选日期提取(区域设置)周数。到目前为止,我还没有找到一个解决方案,我宁愿不写自己的算法。我使用Java8,希望它在新的java时间库中成为可能。您可以使用 这将根据ISO惯例为您提供周数 对于基于区域设置的评估: LocalDate localDate = LocalDate.of(2014, 9, 18); // assuming we picked 18 September 2014 WeekFields wee

我有一个javafx.scene.control.DatePicker。我想从所选日期提取(区域设置)周数。到目前为止,我还没有找到一个解决方案,我宁愿不写自己的算法。我使用Java8,希望它在新的java时间库中成为可能。

您可以使用

这将根据ISO惯例为您提供周数

对于基于区域设置的评估:

LocalDate localDate = LocalDate.of(2014, 9, 18); // assuming we picked 18 September 2014
WeekFields weekFields = WeekFields.of(Locale.US);
int weekNumber = localDate.get(weekFields.weekOfWeekBasedYear());

Java-8-solution可以使用a的值考虑一周的本地定义:


还请记住,流行的替代Joda Time不支持这种本地化的“一年中的一周”字段。例如:在ISO-8601(广泛使用)中,一周从周一开始,在美国从周日开始。此外,给定日历年中一年中第一周开始的时间项取决于区域设置。

FX DatePicker基于新的(到jdk8)日期/时间api-学习如何使用它的时间(虽然我不完全确定是否找到了最短的方法-欢迎更正:-)

选择器的值是LocalDate,可以查询某些临时字段。区域设置感知周相关字段由WeekFields类提供,f.i.weekOfYear:

DatePicker picker = new DatePicker();
picker.valueProperty().addListener((p, oldValue, newValue) -> {
    if (newValue == null) return;
    WeekFields fields = WeekFields.of(Locale.getDefault());

    // # may range from 0 ... 54 without overlapping the boundaries of calendar year
    int week = newValue.get(fields.weekOfYear());

    // # may range from 1 ... 53 with overlapping 
    int weekBased = newValue.get(fields.weekOfWeekBasedYear());

    LOG.info("week/Based " + week + "/" + weekBased);
});

要查看差异,请选择f.i.2012年1月(在周一开始一周的地区)。实际使用哪一个取决于上下文-选择器本身使用weekOfYear(如果启用了ShowWeekNumber)

您也可以使用DateTimeFormatter,这对我来说更容易:

LocalDate date = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("w");
int week = Integer.parseInt(date.format(dtf));

@Magnilex帮不了什么忙-DatePicker返回的值是LocalDate;-)类型To OP:记不清这一周是否已经正确实施,一年中有一个字段对齐的一周,它可能不是你想要的。在我看来,这是一个方便的java时间实现,谢谢,错过了这一个!最后,这是我问题的答案。Thanx.如何获得使用ISO周编号的区域设置?回答我的问题:不要使用区域设置,使用
weekOfyear=date.get(WeekFields.ISO.weekOfWeekBasedYear())仅一个小的更正:
weekOfYear()
的范围为0-54,这意味着此处计算的周数与正常日历年绑定。根据给定区域设置中的周定义,不属于该年的周将显示为0或54。另一个字段
weekOfWeekBasedYear()
的范围为1-53(在许多国家,如ISO-8601中定义的国家)。我承认,这些名字在某种程度上令人困惑,因为它们没有遵循标准语言的使用——也没有遵循ISO文件中使用的术语,而是出于技术动机。关于语言的使用,在欧洲,所有公民和商业世界的人都使用术语“一年中的一周”,意思是一年中的一周。非常混乱。最初,我犯了这个错误,选择了错误的字段
weekOfYear()
@MenoHochschild感谢您的纠正-尽管我现在完全困惑了:-)请接受我的邀请编辑我的答案以纠正我的错误。我现在编辑了您的答案,希望它能帮助我了解这些东西并不容易。您也可以参考这些字段的javadoc。为什么不使用
WeekFields.SUNDAY\u START
?@Alex78191仅仅是因为OP请求了特定于区域设置的周行为的代码。(我的示例是Locale.US的硬代码,但适用于通过的任何语言环境)为什么要使用
IsoFields
而不是
WeekFields.ISO
?@Alex78191没有具体原因,我想在只使用ISO的系统中,这两种代码都有效,使用IsoFields更容易,在一个可以与locale和ISO互换工作的系统中,WeekFields可能是更方便的选择。这个解决方案简单而优雅。只有两条注释:(1)记住,默认情况下,一周从周日开始;(2)模式应该是“W”(大写)而不是“W”(小写,因为它在代码中)。有关模式的更多详细信息,请访问
DatePicker picker = new DatePicker();
picker.valueProperty().addListener((p, oldValue, newValue) -> {
    if (newValue == null) return;
    WeekFields fields = WeekFields.of(Locale.getDefault());

    // # may range from 0 ... 54 without overlapping the boundaries of calendar year
    int week = newValue.get(fields.weekOfYear());

    // # may range from 1 ... 53 with overlapping 
    int weekBased = newValue.get(fields.weekOfWeekBasedYear());

    LOG.info("week/Based " + week + "/" + weekBased);
});
LocalDate date = LocalDate.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("w");
int week = Integer.parseInt(date.format(dtf));