如何使用java.time从年份和星期解析字符串中的日期
在旧的
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周日期感兴趣,而不是在年代. b)仅通过给出(基于周的)年和周数不能形成日历日期.星期几很重要,以确定指定日历周内的日期.预定义的formatter for week-dates需要缺少星期几.所以你需要使用builder-pattern构建一个专门的解析器.然后有必要通过方法parseDefaulting()告诉解析器星期几是哪一天. c)我坚持(并在这里为JSR-310辩护)说一周开始时的问题不是日历问题,而是依赖于国家的问题.美国和法国(例如)使用相同的日历,但对如何定义一周有不同的看法.可以使用明确的ISO引用字段WeekFields.ISO.dayOfWeek()来应用ISO-8601标准.注意:测试显示使用ChronoField.DAY_OF_WEEK和Locale.ROOT似乎并不总是保证ISO周的行为,如我的第一个版本的答案所示(原因尚不清楚 – 我的近距离观察似乎有必要来源启发不直观的行为). d)java-time-package做得很好 – 除了星期一被指定为数字1.我会更喜欢枚举.或者使用enum及其方法getValue(). e)侧面通知:SimpleDateFormat默认表现为宽松. java-time-package更加严格,拒绝用空气来创造一个缺少的星期几 – 即使在宽松的模式下(在我看来这是一件好事).软件不应该如此猜测,相反,程序员应该更多地考虑哪一天是正确的.同样在这里:美国和法国的应用要求可能会有所不同,关于正确的默认设置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |