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