Java最准确的获取当前一周开始时间和结束时间

前言

今天要做一个以周为单位的数据库查询,那么首先就是要获取当前周的开始时间和结束时间,想起来好像挺简单的,在获取的过程中遇到不少坑🕳,现在我把我遇到的问题一一列举出来

预期

我想要是时间格式大概就是这样一周的第一天00点00分00秒到最后一天的23点59分59秒

起始时间:xxxx-xx-xx 00:00:00
结束时间:xxxx-xx-xx 23:59:59


问题

  • 获取到的一周的第一天是星期天,然后我查了一下有些国家就是把星期天当作一天的开始,有些国家是把周一当作一天的开始(因为我这边做的是国外内都出的APP,我就在犹豫到底是周一开始还是周日开始,最后这个讨论决定就用周日当第一天,这个可以看你们自己的需求)
  • 获取时间戳的时候,我看Log输出Date返回的日期是2022-04-24 00:00:00,就在我欣喜获取成功的时候,我拿输出的时间戳去转换一下,发现就变成了2022-04-24 8:00:00?啊这是嘛情况,我切换其它国家的时区还都不一样,疯了,Date明明正常输出,怎么变成时间戳就变了,于是我就强制设置时区为GMT+8就正常了
  • 最后还发现时间戳多了几百毫秒,原因是Calendar.MILLISECOND没有设置

最后我贴出来正确的获取方法

这里我会写两种获取方法


第一种,获取星期日到星期六为一周的起始和结束时间


第二种,获取星期一到星期日为一周的起始和结束时间


获取星期日作为一周的第一天的起始时间和结束时间

public static long[] getCurrentWeekTimeFrame() {
   Calendar calendar = Calendar.getInstance();
   calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
   //start of the week
   calendar.add(Calendar.DAY_OF_WEEK, -(calendar.get(Calendar.DAY_OF_WEEK) - 1));
   calendar.set(Calendar.HOUR_OF_DAY, 0);
   calendar.set(Calendar.MINUTE, 0);
   calendar.set(Calendar.SECOND, 0);
   calendar.set(Calendar.MILLISECOND, 0);

   long startTime = calendar.getTimeInMillis();
   //end of the week
   calendar.add(Calendar.DAY_OF_WEEK, 6);
   calendar.set(Calendar.HOUR_OF_DAY, 23);
   calendar.set(Calendar.MINUTE, 59);
   calendar.set(Calendar.SECOND, 59);
   calendar.set(Calendar.MILLISECOND, 999);
   long endTime = calendar.getTimeInMillis();
   return new long[]{startTime, endTime};
}

获取星期一作为一周的第一天的起始时间和结束时间

public static long[] getCurrentWeekTimeFrame() {
   Calendar calendar = Calendar.getInstance();
   calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
   //start of the week
    if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
        calendar.add(Calendar.DAY_OF_YEAR,-1);
    }
   calendar.add(Calendar.DAY_OF_WEEK, -(calendar.get(Calendar.DAY_OF_WEEK) - 2));
   calendar.set(Calendar.HOUR_OF_DAY, 0);
   calendar.set(Calendar.MINUTE, 0);
   calendar.set(Calendar.SECOND, 0);
   calendar.set(Calendar.MILLISECOND, 0);

   long startTime = calendar.getTimeInMillis();
   //end of the week
   calendar.add(Calendar.DAY_OF_WEEK, 6);
   calendar.set(Calendar.HOUR_OF_DAY, 23);
   calendar.set(Calendar.MINUTE, 59);
   calendar.set(Calendar.SECOND, 59);
   calendar.set(Calendar.MILLISECOND, 999);
   long endTime = calendar.getTimeInMillis();
   return new long[]{startTime, endTime};
}

仔细一看两种方法区别不大
calendar.get(Calendar.DAY_OF_WEEK) - 2
就是这里做了一个减2的动作


第一种做了-1,一周是星期日到星期六
第二种做了-2,一周是星期一到星期日

这里大家看自己需求用哪种方法,你也可以通过判断在某些国家用星期日当前第一天,在另一些国家星期一当作第一天


有什么问题,欢迎大家在评论区留言,有时间看到我就会回复

2022/8/22问题点修复

@你老涛哥
应该是有个BUG,用周一作为一周的第一天,如果当天是周日的话,获取的是下一周的周一周日,例如2022年8月21日,得到的应该是8月15日到8月21日,但是结果是8月22到8月28

已修复该问题,文中代码已更新,请放心使用!


欢迎收藏 Felix的Android笔记

持续更新

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Felix_Fly2021

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值