1.说明: 业务要求,需要知道一个日期是哪个月份的第几周,并且是周一为一周的开始,周一在哪个月,此周就是属于哪个月的;

比如:

2020-02-01 和 2020-02-02属于1月份的第四周 ;

2020-02-03 属于2月份第一周

2.思路: 都2020年了,我们使用JDK8的LocalDate吧,毕竟真香! API好用~

①找到查询日期sourceTime的当月的第一天(firstDayOfMonth),比如2020-02-01,

②从月初firstDayOfMonth开始找到周一(firstMondayOfMonth)

③比较sourceTime是否 >= firstMondayOfMonth;

④如果true,表示sourceTime就是在当月的周,直接计算firstMondayOfMonth和sourceTime相隔天数,除以7后+1来计算是第几周;

⑤如果false,表示sourceTime就是在上月的周,需要计算上月的第一个周一(firstMondayOfMonth_last),并计算sourceTime和firstMondayOfMonth_last相隔天数,除以7后+1来计算是上月第几周;

⑥return

3.代码如下

获取某个时间的月份第一天(网上copy的)

/*** java8(经测试别的版本获取2月有bug) 获取某月第一天的00:00:00

*

*@return

*/

public staticLocalDateTime getFirstLocalDayOfMonth(LocalDateTime localDateTime) {returnlocalDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);

}

获取汉字版月份(这个是自己的笨法子)

/*** 获取汉字版月份

*

*@parammonthNo 第几月

*@return

*/

public static String getMonthChinese(intmonthNo) {switch(monthNo) {case 1:return "一";case 2:return "二";case 3:return "三";case 4:return "四";case 5:return "五";case 6:return "六";case 7:return "七";case 8:return "八";case 9:return "九";case 10:return "十";case 11:return "十一";case 12:return "十二";default:break;

}return null;

}

获取几月份的第几周(核心方法)

/*** 获取几月份的第几周 [X月份第X周]

*

*@paramsourceTime 这个推荐取00:00:00时间

*@return

*/

public static MapgetMonthNoAndWeekNo(LocalDateTime sourceTime) {

Map map = new HashMap<>();

String monthNoAndWeekNo= null;//获取当月的第一天

LocalDateTime firstDayOfMonth =getFirstLocalDayOfMonth(sourceTime);//获取月第一天开始的周一,从当月第一天开始找

LocalDateTime firstMondayOfMonth =firstDayOfMonth;for (int i = 0; i < 6; i++) {

DayOfWeek dayOfWeekTemp=firstMondayOfMonth.getDayOfWeek();if(dayOfWeekTemp.equals(DayOfWeek.MONDAY)) {break;

}//往后推一天

firstMondayOfMonth = firstMondayOfMonth.plusDays(1);

}//比较当月的第一个星期一 < = 参数时间

if (!firstMondayOfMonth.isBefore(sourceTime)) {//如果当月的第一个周一大于参数时间,则要计算到上个月份去//获取上一个月的第一个周一

LocalDateTime lastMontLocalDateTime = sourceTime.minusMonths(1);//上个月的第一天

LocalDateTime firstDayOfMonth_last =getFirstLocalDayOfMonth(lastMontLocalDateTime);//从上个月的第一天开始找周一

LocalDateTime firstMondayOfMonth_last =firstDayOfMonth_last;for (int i = 0; i < 6; i++) {

DayOfWeek dayOfWeekTemp=firstMondayOfMonth_last.getDayOfWeek();if(dayOfWeekTemp.equals(DayOfWeek.MONDAY)) {break;

}//往后推一天

firstMondayOfMonth_last = firstMondayOfMonth_last.plusDays(1);

}//计算两个时间间隔天数 (上月第一个周一 减去 当前时间)

Duration duration =Duration.between(firstMondayOfMonth_last, sourceTime);long diffDays = duration.toDays(); //相差的天数//第几周weekNo

long weekNo = (diffDays / 7) + 1;//月份

int monthNo =firstMondayOfMonth_last.getMonth().getValue();//汉字版月份

String monthChinese =getMonthChinese(monthNo);

monthNoAndWeekNo= monthChinese + "月份" + "第" + weekNo + "周";

map.put("monthNo", monthNo);

map.put("weekNo", weekNo);

map.put("monthNoAndWeekNo", monthNoAndWeekNo);

}else{//当月第一个周一在当前时间之前 firstMondayOfMonth<=sourceTime//计算两个时间间隔天数

int dayOfMonthFirstMonday =firstMondayOfMonth.getDayOfMonth();int dayOfMonthSourceTime =sourceTime.getDayOfMonth();int diffDays = dayOfMonthSourceTime -dayOfMonthFirstMonday;//第几周weekNo

int weekNo = (diffDays / 7) + 1;//月份

int monthNo =sourceTime.getMonth().getValue();

map.put("monthNo", monthNo);

map.put("weekNo", weekNo);//汉字版月份

String monthChinese =getMonthChinese(monthNo);

monthNoAndWeekNo= monthChinese + "月份" + "第" + weekNo + "周";

map.put("monthNoAndWeekNo", monthNoAndWeekNo);

}returnmap;

}

4.测试

public static voidmain(String[] args) {

DateTimeFormatter df= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime sourceTime= LocalDateTime.parse("2020-02-03 17:07:05", df);

Map weekNoOfMonth =getMonthNoAndWeekNo(sourceTime);

System.out.println("weekNoOfMonth :" +weekNoOfMonth);

LocalDateTime sourceTime2= LocalDateTime.parse("2020-02-16 17:07:05", df);

Map weekNoOfMonth2 =getMonthNoAndWeekNo(sourceTime2);

System.out.println("weekNoOfMonth2 :" +weekNoOfMonth2);

LocalDateTime sourceTime3= LocalDateTime.parse("2020-02-01 17:07:05", df);

Map weekNoOfMonth3 =getMonthNoAndWeekNo(sourceTime3);

System.out.println("weekNoOfMonth3 :" +weekNoOfMonth3);

}

结果如下:

weekNoOfMonth :{monthNo=2, weekNo=1, monthNoAndWeekNo=二月份第1周}

weekNoOfMonth2 :{monthNo=2, weekNo=2, monthNoAndWeekNo=二月份第2周}

weekNoOfMonth3 :{monthNo=1, weekNo=4, monthNoAndWeekNo=一月份第4周}

5.总结

上面逻辑应该可以优化~

java 获取月份 几周_获取日期是月份中的第几周(以周一为开始时间)相关推荐

  1. java获取当前年月日历_获取当前月日历

    /**  *  * 根据年.月获取当前月日历  *  */ import java.text.ParseException; import java.text.SimpleDateFormat; im ...

  2. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  3. python获取每月的最后一天_关于日期:使用Python获取本月的最后一天

    是否有一种方法可以使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天? 如果标准库不支持,那么dateutil包是否支持此功能? 我是唯一一个认为你在要求Python的最后一天的人吗 ...

  4. 取 java 程序运行的路径_获取Java程序运行的路径 | 获取当前jar包的路径

    经过试验,不管是否是Jar包,不管是否是Tomcat部署,以下三个方法均可实现. package test; public class MyPath { public static String ge ...

  5. java 获得当月天数_java中 如何获取当月的天数、指定日期的月份天数详解

    代码实现如下:import java.util.Calendar; public class GetDay { public static void main(String[] args) { int ...

  6. java jnlp 靠谱吗_获取当前的JNLP信息

    有各种策略来实现预期目标 . 我不会重新审视那些已经提到过的,而是重复几个 . 1)信息可以放在档案的清单中 . 可以使用java.lang.Package类的方法检索它 . String title ...

  7. java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...

    众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...

  8. java返回当年的天数_获取Java中当年剩余的天数

    要获取当年剩余的天数,请找出当年总天数与经过的总天数之差. 首先,计算一年中的日期.Calendar calOne = Calendar.getInstance(); int dayOfYear =  ...

  9. java实时获取android网速_获取Android网速的另一种方法

    之前,在LOSP4.2上使用的是Android自带的接口来实现获取网速并显示在通知栏,可是到了4.3以后发现这个接口无论如何,返回值都是-1,无奈之下只得另寻办法 功夫不负有心人,我还是找到了一个方法 ...

  10. java 获取包名类名_获取指定包名下的所有类的类名(全名)

    参考来源: 以下代码一键运行: package test; import java.io.File; import java.io.IOException; import java.net.JarUR ...

最新文章

  1. CSS实现鼠标移入图片边框有小三角
  2. c+和python的区别-c语言和python之间有什么区别
  3. 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版
  4. 如何创造出更优秀的用户体验?
  5. (Excel)常用函数公式及操作技巧之四:文本与页面设置(一)
  6. C++数据类型与C#对应关系 c#调用WINDWOS API时,非常有用
  7. VSCode:vscode设置侧边资源管理器文字大小
  8. github库fork后,将更新提交到源库
  9. [codeforces 760B]Frodo and pillows
  10. 专访阿里云游戏首席架构师李刚:如何解决云服务技术两大痛点?
  11. 收入结算与提现常见问题( iOS )
  12. 墙裂推荐一个高质量的数据分析学习平台
  13. 10Easyx图形编程
  14. 苹果电脑怎么用移动硬盘ntfs?快速读取和编辑Mac外置移动硬盘
  15. (三)并发编程:特殊的一个单线程:主线程(Main线程)
  16. android opengl ppt,Opengl example.ppt
  17. emucheat,emucheat下载
  18. 经典加密算法的实现与破解大素数生成算法
  19. 大数据学习之路-Linux基础
  20. CMOS门电路工作原理与构成的反相器详细分析

热门文章

  1. jersey 原生ajax,jsonp ajax jersey 跨域访问
  2. EditPlus安装步骤
  3. vulstack2(hydra爆mssql、免杀360、cs、msf渗透、weblogic、computer brower服务支持6118,域管密码过期kerberos认证错误导致部分域服务不可用)
  4. Janus: P2P打洞失败
  5. SpringCloud系列之服务总线(Bus)
  6. linux sd卡修复工具,免费的SD卡数据恢复工具介绍
  7. 拜耳新一代犬体内驱虫药拜宠清登陆中国市场
  8. spring cloud拓扑图
  9. c语言结构体编程时钟,c语言简单数学时钟(结构体,指针),求大佬帮助
  10. RFID电子标签对于图书管理的应用