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

发布时间:2020-10-17 03:12:24 作者:Java萌新
来源:网络 阅读:3030

先上问题

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

推荐阅读:
  1. JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
  2. JS怎么获取月的第几周和年的第几周示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java 架构 程序员

上一篇:python编写简易聊天室实现局域网内聊天功能

下一篇:Android自定义弹出框dialog效果

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》