gpt4 book ai didi

java - 如何使用 java.time 从带有年和周的字符串中解析日期

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:40 24 4
gpt4 key购买 nike

在旧的 java 中我可以这样做:

System.out.println(new SimpleDateFormat("yyyy w", Locale.UK).parse("2015 1"));
// shows Mon Dec 29 00:00:00 CET 2014

System.out.println(new SimpleDateFormat("yyyy w", Locale.US).parse("2015 1"));
// shows Mon Dec 28 00:00:00 CET 2014

我想在 Java 8 中使用 java.time。

System.out.println( LocalDate.parse("2015 1", DateTimeFormatter.ofPattern("yyyy w", Locale.US)));

结果:

java.time.format.DateTimeParseException:无法解析文本“2015 1”:无法从 TemporalAccessor 获取 LocalDate:{WeekOfWeekBasedYear[WeekFields[SUNDAY,1]]=1,Year=2015},ISO 类型为 java .time.format.Parsed

如何在 java.time 中实现?

此外,我不满足于必须通过 Locale 来确定一周的第一天:星期一还是星期日。这不是国家特征而是日历特征。我想使用 java.time.temporal.WeekFields.ISO 之类的东西向世界展示从星期一开始的一周

我发现了类似的情况:https://stackoverflow.com/questions/3941700/how-to-get-dates-of-a-week-i-know-week-number

但对于 Java 8 中的 java.time 则不然。此外,首先创建日期对象然后设置正确星期的解决方案并不优雅。我想一次创建最终日期。

最佳答案

直接回答和解决:

System.out.println( 
LocalDate.parse("2015 1",
new DateTimeFormatterBuilder().appendPattern("YYYY w")
.parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
.toFormatter()));
// output: 2014-12-29

解释:

a) 你应该使用 Y 而不是 y 因为你对 ISO-8601-week-date 感兴趣,而不是 year-of-era。

b) 不能仅通过给出(基于周的)年份和周数来形成日历日期。星期几对于确定指定日历周内的日期很重要。预定义的 formatter for week-dates需要缺少星期几。所以你需要使用构建器模式构建一个专门的解析器。然后有必要告诉解析器需要星期几 - 通过方法 parseDefaulting()

c) 我坚持(并在这里为 JSR-310 辩护)说一周开始的时间不是日历问题而是取决于国家/地区的问题。美国和法国(例如)使用相同的日历,但对如何定义一周有不同的看法。可以使用明确的 ISO 引用字段 WeekFields.ISO.dayOfWeek() 应用 ISO-8601 标准。 注意:测试表明,将 ChronoField.DAY_OF_WEEKLocale.ROOT 一起使用似乎并不总能保证 ISO 周行为,如中所示我这个答案的第一个版本(原因对我来说还不清楚 - 似乎有必要仔细查看来源以启发不直观的行为)。

d) java-time-package 做得很好——除了星期一被指定为数字 1。我更喜欢枚举。或者使用枚举及其方法 getValue()

e) 旁注:SimpleDateFormat 默认情况下表现得很宽松。 java-time-package 更严格并且拒绝凭空发明一个缺少的星期几 - 即使在宽松模式下(在我看来这是一件好事)。软件不应该猜测那么多,相反,程序员应该更多地考虑星期几是正确的。再次强调:在正确的默认设置方面,美国和法国的应用程序要求可能会有所不同。

关于java - 如何使用 java.time 从带有年和周的字符串中解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27928720/

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