Java8使用LocalDateTime获取正确的第几周-创新互联
先上问题
创新互联-专业网站定制、快速模板网站建设、高性价比德保网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式德保网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖德保地区。费用合理售后完善,十余年实体公司更值得信赖。public static void main(String[] args) {
//使用DateTimeFormatter获取当前周数
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("w");
//2018年第一天
System.out.println(LocalDateTime.of(2018, 1, 1, 0, 0, 0).format(dateTimeFormatter));
//2018年最后一天
System.out.println(LocalDateTime.of(2018, 12, 31, 0, 0, 0).format(dateTimeFormatter));
//2019年第一天
System.out.println(LocalDateTime.of(2019, 1, 1, 0, 0, 0).format(dateTimeFormatter));
//2019年最后一天
System.out.println(LocalDateTime.of(2019, 12, 31, 0, 0, 0).format(dateTimeFormatter));
//这天是星期六
System.out.println(LocalDateTime.of(2019, 4, 6, 0, 0, 0).format(dateTimeFormatter));
//这天是星期日
System.out.println(LocalDateTime.of(2019, 4, 7, 0, 0, 0).format(dateTimeFormatter));
//这天是星期一
System.out.println(LocalDateTime.of(2019, 4, 8, 0, 0, 0).format(dateTimeFormatter));
}
执行结果:
1
1
1
1
14
15
15
有没有发现很奇怪的一件事情,每年的最后1天和第1天居然都是第1周而且每周的第1天是周日!这明显不符合我们要获取的周数,正常的周数是每年最后1天是53周,第1天为第1周,每周从周一开始计算,那么为什么呢?
因为默认使用ISO8061 标准,该标准与我们所认知的周数计算并不一致所以导致了获取的周数不符合预期
解决方案:
public static void main(String[] args) {
//使用DateTimeFormatter获取当前周数
WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY,1);
//2018年第一天
System.out.println(LocalDateTime.of(2018, 1, 1, 0, 0, 0).get(weekFields.weekOfYear()));
//2018年最后一天
System.out.println(LocalDateTime.of(2018, 12, 31, 0, 0, 0).get(weekFields.weekOfYear()));
//2019年第一天
System.out.println(LocalDateTime.of(2019, 1, 1, 0, 0, 0).get(weekFields.weekOfYear()));
//2019年最后一天
System.out.println(LocalDateTime.of(2019, 12, 31, 0, 0, 0).get(weekFields.weekOfYear()));
//这天是星期六
System.out.println(LocalDateTime.of(2019, 4, 6, 0, 0, 0).get(weekFields.weekOfYear()));
//这天是星期日
System.out.println(LocalDateTime.of(2019, 4, 7, 0, 0, 0).get(weekFields.weekOfYear()));
//这天是星期一
System.out.println(LocalDateTime.of(2019, 4, 8, 0, 0, 0).get(weekFields.weekOfYear()));
}
执行结果:
1
53
1
53
14
14
15
此时结果已经符合预期,每周从周一开始且每年的第一天为第一周
如果有更好的方案欢迎留言交流
其他方案
如果按照每年的第N周计算周数,在1月1日非周日的情况下必然会有一周中包含两个周数会导致数据错乱
建议使用自然周,即为当前时间-某个周一=周数
LocalDateTime staticLocalDateTime=LocalDateTime.of(2019, 4, 8, 0, 0, 0);
BigDecimal.valueOf(Duration.between(staticLocalDateTime, nowLocalDateTime).toDays()+1).divide(BigDecimal.valueOf(7), 0, RoundingMode.UP).longValue();
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页题目:Java8使用LocalDateTime获取正确的第几周-创新互联
文章网址:http://hbruida.cn/article/cosopj.html