从Java FX中获取给定日期的周数

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

Java-8解决方案可以使用日期选择器的值来考虑一周的本地定义:

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(广泛使用)中,本周从周一开始,在美国周日开始。 此外,在给定日历年中第一周开始的项目取决于区域设置。

您可以使用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()); 

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

选择器的值是LocalDate,可以查询某些TemporalField。 WeekFields类提供了与语言环境相关的与周相关的字段,fi 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); }); 

要查看差异,请选择2012年1月的fi(在星期一开始一周的区域设置)。 实际使用哪一个取决于上下文 – 选择器本身使用weekOfYear(如果启用了showWeekNumbers)

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

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