获取Javafx中给定日期的周数

时间:2014-09-18 12:20:25

标签: java javafx java-8 javafx-8

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

4 个答案:

答案 0 :(得分:7)

Java-8解决方案可以使用date-picker的值来考虑一周的本地定义:

LocalDate date = datePicker.getValue(); // input from your date picker
Locale locale = Locale.US;
int weekOfYear = date.get(WeekFields.of(locale).weekOfWeekBasedYear());

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

答案 1 :(得分:5)

您可以使用http://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#get-java.time.temporal.TemporalField-

LocalDate localDate = LocalDate.of(2014, 9, 18); // assuming we picked 18 September 2014
int weekNumber = localDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);

这将根据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());

答案 2 :(得分:3)

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

选择器的值是LocalDate,可以查询某些TemporalField。 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(如果启用了showWeekNumbers)

答案 3 :(得分:0)

您还可以使用DateTimeFormatter,对我来说看起来更简单:

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