我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

Java8使用LocalDateTime获取正确的第几周

先上问题

成都创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十载时间我们累计服务了上千家以及全国政企客户,如成都三维植被网等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称扬。

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();


网页题目:Java8使用LocalDateTime获取正确的第几周
转载来源:http://shouzuofang.com/article/gchihh.html

其他资讯