java 获取月份 几周_获取日期是月份中的第几周(以周一为开始时间)
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 获取月份 几周_获取日期是月份中的第几周(以周一为开始时间)相关推荐
- java获取当前年月日历_获取当前月日历
/** * * 根据年.月获取当前月日历 * */ import java.text.ParseException; import java.text.SimpleDateFormat; im ...
- java jsp取静态常量_获取java静态
Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...
- python获取每月的最后一天_关于日期:使用Python获取本月的最后一天
是否有一种方法可以使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天? 如果标准库不支持,那么dateutil包是否支持此功能? 我是唯一一个认为你在要求Python的最后一天的人吗 ...
- 取 java 程序运行的路径_获取Java程序运行的路径 | 获取当前jar包的路径
经过试验,不管是否是Jar包,不管是否是Tomcat部署,以下三个方法均可实现. package test; public class MyPath { public static String ge ...
- java 获得当月天数_java中 如何获取当月的天数、指定日期的月份天数详解
代码实现如下:import java.util.Calendar; public class GetDay { public static void main(String[] args) { int ...
- java jnlp 靠谱吗_获取当前的JNLP信息
有各种策略来实现预期目标 . 我不会重新审视那些已经提到过的,而是重复几个 . 1)信息可以放在档案的清单中 . 可以使用java.lang.Package类的方法检索它 . String title ...
- java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- java返回当年的天数_获取Java中当年剩余的天数
要获取当年剩余的天数,请找出当年总天数与经过的总天数之差. 首先,计算一年中的日期.Calendar calOne = Calendar.getInstance(); int dayOfYear = ...
- java实时获取android网速_获取Android网速的另一种方法
之前,在LOSP4.2上使用的是Android自带的接口来实现获取网速并显示在通知栏,可是到了4.3以后发现这个接口无论如何,返回值都是-1,无奈之下只得另寻办法 功夫不负有心人,我还是找到了一个方法 ...
- java 获取包名类名_获取指定包名下的所有类的类名(全名)
参考来源: 以下代码一键运行: package test; import java.io.File; import java.io.IOException; import java.net.JarUR ...
最新文章
- CSS实现鼠标移入图片边框有小三角
- c+和python的区别-c语言和python之间有什么区别
- 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版
- 如何创造出更优秀的用户体验?
- (Excel)常用函数公式及操作技巧之四:文本与页面设置(一)
- C++数据类型与C#对应关系 c#调用WINDWOS API时,非常有用
- VSCode:vscode设置侧边资源管理器文字大小
- github库fork后,将更新提交到源库
- [codeforces 760B]Frodo and pillows
- 专访阿里云游戏首席架构师李刚:如何解决云服务技术两大痛点?
- 收入结算与提现常见问题( iOS )
- 墙裂推荐一个高质量的数据分析学习平台
- 10Easyx图形编程
- 苹果电脑怎么用移动硬盘ntfs?快速读取和编辑Mac外置移动硬盘
- (三)并发编程:特殊的一个单线程:主线程(Main线程)
- android opengl ppt,Opengl example.ppt
- emucheat,emucheat下载
- 经典加密算法的实现与破解大素数生成算法
- 大数据学习之路-Linux基础
- CMOS门电路工作原理与构成的反相器详细分析
热门文章
- jersey 原生ajax,jsonp ajax jersey 跨域访问
- EditPlus安装步骤
- vulstack2(hydra爆mssql、免杀360、cs、msf渗透、weblogic、computer brower服务支持6118,域管密码过期kerberos认证错误导致部分域服务不可用)
- Janus: P2P打洞失败
- SpringCloud系列之服务总线(Bus)
- linux sd卡修复工具,免费的SD卡数据恢复工具介绍
- 拜耳新一代犬体内驱虫药拜宠清登陆中国市场
- spring cloud拓扑图
- c语言结构体编程时钟,c语言简单数学时钟(结构体,指针),求大佬帮助
- RFID电子标签对于图书管理的应用