解决对给定一个时间段补全成整周并且按中国周分割时间的问题

问题:

最近项目维护遇到客户提的一个需求,原来项目中有一个日报功能,现在客户需要将日报改为周报。

要求:给定一个时间段(时间不超过30天),要求将时间补成整周按周分割并且得到该周为几几年几月第几周。周一为一周的开始,如果周跨月的话,按周一所在的月计算。

解决方案:

1 将时间补为整周

  1. 向前补齐

    public String roundForward(String beginTime) throws ParseException {final int  monday = 2;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(beginTime);Calendar calendar = Calendar.getInstance();calendar.setFirstDayOfWeek(Calendar.MONDAY);calendar.setTime(date);if (calendar.get(Calendar.DAY_OF_WEEK) != monday){int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);if(dayWeek==1){dayWeek = 8;}calendar.add(Calendar.DATE,-(dayWeek-2));System.out.println(sdf.format(calendar.getTime()));beginTime = sdf.format(calendar.getTime());}return beginTime;}
    
  2. 向后补齐

    public String roundBackward(String endTime) throws ParseException {final int  sunday = 1;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(endTime);Calendar calendar = Calendar.getInstance();calendar.setFirstDayOfWeek(Calendar.MONDAY);calendar.setTime(date);if (calendar.get(Calendar.DAY_OF_WEEK) != sunday){int dayWeek = calendar.get(Calendar.DAY_OF_WEEK);calendar.add(Calendar.DATE,+(8-dayWeek));System.out.println(sdf.format(calendar.getTime()));endTime = sdf.format(calendar.getTime());}return endTime;}
    

    (个人使用JDK8,Calendar类,发现即使设置为中国周(周一为第一天),使用calendar.get(Calendar.DAY_OF_WEEK)周一的值还是2,有点疑惑??)

2 根据Calendar官方方法计算输入时间为几月第几周。

(官方提供的calendar.get(Calendar.WEEK_OF_MONTH)设置为中国周后会把不完整的周算作第一周,然后把从周一开始的算作第二周,和我需要的业务逻辑不符合所以需要对逻辑进行修改。)

public String dayOfWeekInMonth(String day) throws ParseException {final int monday = 2;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(day);Calendar calendar = Calendar.getInstance();//设置中国周calendar.setFirstDayOfWeek(Calendar.MONDAY);calendar.setTime(date);Integer year = calendar.get(Calendar.YEAR);Integer month = calendar.get(Calendar.MONTH) + 1;Integer week = calendar.get(Calendar.WEEK_OF_MONTH);//设置为当前月第一天calendar.set(Calendar.DAY_OF_MONTH,1);//HashMap<Integer,Integer> map = new HashMap<>(1);String result;if (calendar.get(Calendar.DAY_OF_WEEK) == monday){result = year+":"+month+":"+week;return result;}else {if(week > 1){result = year+":"+month+":"+(week - 1);return result;}else {calendar.add(Calendar.MONTH,-1);//判断上个月最后一周是第几周week = monthManyWeek(calendar);result = year+":"+(calendar.get(Calendar.MONTH)+1)+":"+week;return result;}}}

(如何判断某个月的第一周是属于本月还是上个月?根据这个月的第一天1号是否是星期一,如果是那么第一周就是这个月第一周,如果不是那么这个月第一周属于上个月最后一周。)

3 计算某月有几周

public Integer monthManyWeek(Calendar calendar){final int monday = 2;calendar.set(Calendar.DAY_OF_MONTH,1);if (calendar.get(Calendar.DAY_OF_WEEK) == monday){calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return calendar.get(Calendar.WEEK_OF_MONTH);}else {calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return calendar.get(Calendar.WEEK_OF_MONTH) - 1;}}

4 测试

public void main(String[] args) throws ParseException {     String beginTime = "2021-03-02";String endTime = "2021-04-15";beginTime = roundForward(beginTime);endTime = roundBackward(endTime);String beginData = dayOfWeekInMonth(beginTime);String endData = dayOfWeekInMonth(endTime);String [] begin = beginData.split(":");String [] end = endData.split(":");int bm = Integer.parseInt(begin[1]);int bw = Integer.parseInt(begin[2]);int em = Integer.parseInt(end[1]);int ew = Integer.parseInt(end[2]);int count;if (bm==em){count = ew - bw + 1;System.out.println(count);}else {int maxcount = countBeginMonthWeek(beginTime);count = maxcount - bw + 1 + ew;System.out.println(count);}ArrayList<WeeklyDTO> list = (ArrayList<WeeklyDTO>) toResult(beginTime,endTime,count);
}
public List<WeeklyDTO> toResult(String beginTime, String endTime, int count) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date beginDate = sdf.parse(beginTime);Calendar bcalendar = Calendar.getInstance();Calendar ecalendar = Calendar.getInstance();bcalendar.setFirstDayOfWeek(Calendar.MONDAY);ecalendar.setFirstDayOfWeek(Calendar.MONDAY);bcalendar.setTime(beginDate);ecalendar.setTime(beginDate);List<WeeklyDTO> list = new ArrayList<WeeklyDTO>(count);bcalendar.add(Calendar.DATE,-7);ecalendar.add(Calendar.DATE,-1);for (int i = 0;i < count;i++){WeeklyDTO weeklyDTO = new WeeklyDTO();bcalendar.add(Calendar.DATE,7);ecalendar.add(Calendar.DATE,7);String str = dayOfWeekInMonth(sdf.format(bcalendar.getTime()));String [] s = str.split(":");int by = Integer.parseInt(s[0]);int bm = Integer.parseInt(s[1]);int bw = Integer.parseInt(s[2]);System.out.println(sdf.format(bcalendar.getTime())+"------->"+sdf.format(ecalendar.getTime())+"----"+str);weeklyDTO.setBeginTime(sdf.format(bcalendar.getTime()));weeklyDTO.setEndTime(sdf.format(ecalendar.getTime()));weeklyDTO.setWeekfomonth(by+"年"+bm+"月"+bw+"周");list.add(weeklyDTO);}return list;}

(main函数中我计算时间段内有多少周的方法有问题,我的需求是时间段不超过30天,所以这样可以算。如果你的时间段比较长可能跨好几个月。建议用补成整周后的开始时间和结束时间的差值除以7得到周数)

5 测试结果

解决对给定一个时间段补全成整周并且按周分割时间的问题相关推荐

  1. [解决]eclipse中android自动补全/提示卡机或假死

    这是Eclipse3.6版本的特有问题,想彻底解决此问题的话,还是建议换为3.5/3.4: 在保持版本不变的前提下,可以按如下方法优化下: 解决办法: 1. 找到你的JDK安装目录下的src.zip文 ...

  2. java不会自动提示_eclispe中打点不会提示的解决方法,以及自动补全

    Eclipse中打点无提示的解决办法 建了个JAVA工程,然后发现输入代码后,在输入.后面不会弹出来我所要的函数. alt+/      提示No Default Proposals 自己找了半天,终 ...

  3. 解决vscode突然不能自动补全html标签

    之前不知道安装了什么可能与vscode有些冲突,出现了这样的情况:在.html文件页面中输入div,但是敲Enter键,输出的只是div三个英文字母,前面的小标志变成了abc,不能自动把标签补全成&l ...

  4. 解决Sublime突然无法自动补全问题

    问题:Sublime的补全提示功能突然消失. 原因:安装了SublimeCodeIntel插件后与Sublime本身的功能冲突. 解决方法:卸载SublimeCodeIntel插件: 1.ctrl+s ...

  5. 使用 Elasticsearch 做一个好用的日语搜索引擎及自动补全

    最近基于 Elastic Stack 搭建了一个日语搜索服务,发现日文的搜索相比英语和中文,有不少特殊之处,因此记录下用 Elasticsearch 搭建日语搜索引擎的一些要点.本文所有的示例,适用于 ...

  6. java中使用kuromoji_使用Elasticsearch做一个好用的日语搜索引擎及自动补全

    最近基于 Elastic Stack 搭建了一个日语搜索服务,发现日文的搜索相比英语和中文,有不少特殊之处,因此记录下用 Elasticsearch 搭建日语搜索引擎的一些要点.本文所有的示例,适用于 ...

  7. 解决Kali Linux XFCE桌面Tab无法补全

    解决Kali Linux XFCE桌面Tab无法补全 在Linux中,TAB自动补全功能已经让所有用户都非常依赖.但是,Kali Linux默认安装的XFCE桌面,无法使用Tab进行补全.该问题是因为 ...

  8. php exec多条命令怎么拼接_PHP--手摸手,教你撸一个会自动补全的命令行工具1

    前言 一次在使用symfony的时候,发现使用命令行的时候有些关键字会自动提示. 介绍 随着laravel,symfony等框架的流行,命令行工具越来越流行,但是很多时候命令太多,根本无法记住所有参数 ...

  9. ​NeurIPS 2020 | 面向张量分解知识图谱补全的对偶诱导正则

    简介 近年来,张量分解模型凭借模型简洁.计算速度快等优点在知识图谱补全任务上取得了令人瞩目的成就.但是,这些模型较易受到过拟合的影响,在性能上通常落后于其他类型的模型.为解决过拟合问题,包括 L2 正 ...

最新文章

  1. OSCHina技术导向:Java全文搜索框架Lucene
  2. Java_Freemarker
  3. [Js-开发常识]为什么定义实体类属性建议用 Ineger 而不是 int
  4. 【STC15库函数上手笔记】3、外部中断
  5. bootstrap登录表单
  6. 斯坦福 CS228 概率图模型中文讲义 一、引言
  7. 随想录(mmu的学习)
  8. 7款国产的在线HTML编辑器
  9. Unity AssetsBundle
  10. linux下解压缩rar格式的文件压缩包
  11. linux设备符,linux 字符设备(一)
  12. SeaChest Utilities 工具,让你的硬盘功耗又低又长寿
  13. 如何解除禁用 UAC
  14. ISBN(国际标准书号)的校验
  15. Cocos2dx3.2学习准备(一):C++11新特性
  16. 程序存储器 指令寄存器 程序计数器 地址寄存器
  17. Photoshop 2023 Mac(PS 2023)v24.0.0中英文已发布,新功能详细介绍,支持M1/M2/intel
  18. 超级计算机也无法算尽圆周率,圆周率如果被算尽意味着什么?
  19. 设计婴儿、人体冷冻... 颠覆未来的8种技术!网友:太可怕了
  20. 原生拖拽太拉跨了,纯JS自己手写一个拖拽效果,纵享丝滑

热门文章

  1. 家庭账务管理系统html,基于WEB的家庭财务管理系统(46页)-原创力文档
  2. 关于STM32中定义数组的问题
  3. [数据压缩]实验四 DPCM编码
  4. Self-Supervised Pre-Training for Transformer-BasedPerson Re-Identification 论文阅读与翻译
  5. Gitlab clone错误
  6. 第四章C语言程序设计实训教程(练习题)
  7. 长虹电视升级到官方最新版后安装软件方法
  8. 亚马逊费用如何核对-跨境知道
  9. 转 PCB各层的含义 (solder paste 区别)
  10. 受欢迎的20部灾难片,你看过多少