gpt4 book ai didi

java - 使用 java.time 包从给定的周和年获取星期一日期

转载 作者:行者123 更新时间:2023-12-02 14:24:12 25 4
gpt4 key购买 nike

我想使用 Java 8 包 java.time 获取给定年份和星期的星期一日期。但在某些时候我面临问题,因为它没有返回正确的日期。

private LocalDate getDateFromWeekAndYear(final String week,final String year){
LocalDate date = LocalDate.now();
date = date.with(WeekFields.ISO.dayOfWeek(), 1);
date = date.with(WeekFields.ISO.weekOfWeekBasedYear(), Long.parseLong(week));
date = date.with(WeekFields.ISO.weekBasedYear(), Long.parseLong(year));

return date;
}

例如:

  • 如果我通过 week=1 和year=2013,则日期为:2012-12-31。
  • 但是,如果我通过 week=53 和year=2015,则日期为:2014-12-29。我预计2014年12月28日。

我是否犯了任何逻辑错误或其他问题?

最佳答案

这比 OP 和大多数答案所显示的部分无效的期望要困难得多。

首先要说的是:定义基于周的操作的正确顺序非常重要。OP 首先应用了日操作,然后是基于年的操作。正确的做法是反过来!我将展示正确的辅助方法实现:

public static void main(String... args) {
System.out.println(
getDateFromWeekAndYear("53", "2015")); // 2015-12-28, NOT 2014-12-28
System.out.println(
getDateFromWeekAndYear("53", "2015").get(WeekFields.ISO.weekOfWeekBasedYear())); // 53
System.out.println(
getDateFromWeekAndYear("53", "2014")); // 2014-12-29
System.out.println(
getDateFromWeekAndYear("53", "2014").get(WeekFields.ISO.weekOfWeekBasedYear())); // 1
}

private static LocalDate getDateFromWeekAndYear(final String week,final String year) {
int y = Integer.parseInt(year);
LocalDate date = LocalDate.of(y, 7, 1); // safer than choosing current date
// date = date.with(WeekFields.ISO.weekBasedYear(), y); // no longer necessary
date = date.with(WeekFields.ISO.weekOfWeekBasedYear(), Long.parseLong(week));
date = date.with(WeekFields.ISO.dayOfWeek(), 1);

return date;
}

如果您不遵守此特定顺序,那么您有时确实会在输入 2015-W53 时得到 2014 年日期(取决于当前日期)。

第二个问题:我也避免从当前日期开始,以免接近日历年的开始或结束(日历年!=基于周的年),而是选择了中间年作为起点。

第三个问题是对 2014 年(基于周)的第 53 周的宽松处理。它不存在,因为 2014 年只有 52 周!严格的算法应该识别并拒绝这样的输入。因此,我建议不要使用 YearWeek.of(2014, 53) (在外部库 Threeten-Extra 中)导致 2015 年第一周,另请参阅其 javadoc 。比这种宽松的处理要好

YearWeek yw = YearWeek.of(2014, 52);
if (yw.is53WeekYear()) {
yw = YearWeek.of(2014, 53);
}

或者使用我自己的时间库中的代码 Time4J (与 YearWeek 相比,其类 CalendarWeek 具有额外的 i18n 功能和额外的周算术):

CalendarWeek.of(2014, 53); // throws an exception
System.out.println(CalendarWeek.of(2014, 1).withLastWeekOfYear()); // 2014-W52

仅使用java.time-package:

使用这样的外部库至少有助于以透明的方式解决第一个问题。如果您不愿意添加额外的依赖项,那么您可以这样做来处理第 53 周(如果无效):

如果应用于辅助方法结果的表达式 WeekFields.ISO.weekOfWeekBasedYear() 生成值 1,那么您就知道第 53 周无效。然后您可以决定是接受宽松的处理还是抛出异常。但恕我直言,默默地调整这样一个无效的输入是糟糕的设计。

关于java - 使用 java.time 包从给定的周和年获取星期一日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42001475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com