当前位置:网站首页>获取指定年度所有周的工具类
获取指定年度所有周的工具类
2022-08-09 10:46:00 【'LYong】
package com.unionx.core.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WeekUtils {
/**
*
* Description:保存到缓存中,每年1月1日定时刷新
* @param args
* @return void
* @author name:
*
*/
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);//获取年份
System.out.println("当前年份是:"+year);
List<String[]> list = WeekUtils.getWeeksByYear(year);
for (int i = 0; i < list.size(); i++) {
WeekTime weekTime = new WeekTime();
String[] arr = list.get(i);
weekTime.setStartTime(DateUtils.stringToDate(arr[0], "yyyy-MM-dd"));
weekTime.setEndTime(DateUtils.stringToDate(arr[1], "yyyy-MM-dd"));
weekTime.setWeek(i+1);
weekTime.setYear(year+"");
RedisUtils.insertSelective(weekTime);
}
System.out.println("日历更新完成");
}
/**
* 返回指定年度的所有周。List中包含的是String[2]对象<br>
* string[0]本周的开始日期,string[1]是本周的结束日期。<br>
* 日期的格式为yyyy-MM-dd。<br>
* 每年的第一个周,必须包含星期一且是完整的七天。<br>
* 星期一在哪一年,那么包含这个星期的周就是哪一年的周。<br>
*
* @param year 格式 yyyy ,必须大于1900年度 小于9999年
* @return
*/
public static List<String[]> getWeeksByYear(final int year){
if(year<1900 || year >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
//实现思路,首先计算当年有多少个周,然后找到每个周的开始日期和结束日期
Calendar calendar = new GregorianCalendar();
// 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。
calendar.setFirstDayOfWeek(Calendar.MONDAY);
//设置每周的第一天为星期一
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
//每周从周一开始
//上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
calendar.setMinimalDaysInFirstWeek(7);
//设置每周最少为7天//
calendar.set(Calendar.YEAR, year);
// 设置年度为指定的年//
//首先计算当年有多少个周,每年都至少有52个周,个别年度有53个周
int weeks = getWeekNumByYear(year);//
System.out.println(year+"共有"+weeks+"个周");
List<String[]> result = new ArrayList<String[]>(weeks);
for(int i=1;i<=weeks;i++){
String[] tempWeek = new String[2];
tempWeek[0] = getYearWeekFirstDay(year,i);
tempWeek[1] = getYearWeekEndDay (year,i);
result.add(tempWeek);//
System.out.println(i+"="+tempWeek[0]+"_"+tempWeek[1]);
}
return result;
}
/**
* 计算指定年度共有多少个周。
* @param year 格式 yyyy ,必须大于1900年度 小于9999年
* @return
*/
public static int getWeekNumByYear(final int year){
if(year<1900 || year >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
int result = 52;//每年至少有52个周 ,最多有53个周。
String date = getYearWeekFirstDay(year,53);
if(date.substring(0, 4).equals(year+"")){ //判断年度是否相符,如果相符说明有53个周。
result = 53;
}
System.out.println(result);
return result;
}
/**
* 计算某年某周的开始日期
* @param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
* @param weekNum 1到52或者53
* @return 日期,格式为yyyy-MM-dd
*/
public static String getYearWeekFirstDay(int yearNum,int weekNum) {
if(yearNum<1900 || yearNum >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//每周从周一开始
//上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
cal.setMinimalDaysInFirstWeek(7);//设置每周最少为7天
cal.set(Calendar.YEAR, yearNum);
cal.set(Calendar.WEEK_OF_YEAR, weekNum);
//分别取得当前日期的年、月、日
return getFormatDate(cal.getTime());
}
/***
*
* Description:格式化时间
* @param time
* @return
* @return String
* @author name
*
*/
private static String getFormatDate(Date time) {
String format = DateUtils.format(time, "yyyy-MM-dd");
return format;
}
/**
* 计算某年某周的结束日期
* @param yearNum 格式 yyyy ,必须大于1900年度 小于9999年
* @param weekNum 1到52或者53
* @return 日期,格式为yyyy-MM-dd
*/
public static String getYearWeekEndDay(int yearNum,int weekNum) {
if(yearNum<1900 || yearNum >9999){
throw new NullPointerException("年度必须大于等于1900年小于等于9999年");
}
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY); //设置每周的第一天为星期一
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//每周从周一开始
//上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期一的那个周。
cal.setMinimalDaysInFirstWeek(7);//设置每周最少为7天
cal.set(Calendar.YEAR, yearNum);
cal.set(Calendar.WEEK_OF_YEAR, weekNum);
return getFormatDate(cal.getTime());
}
/**
*
* Description:判断一年的第几周
* @param datetime
* @return
* @throws java.text.ParseException
* @return Integer
* @author name
*
*/
public static Integer whatWeek(String datetime) throws java.text.ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(datetime);
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(date);
Integer weekNumbe = calendar.get(Calendar.WEEK_OF_YEAR);
return weekNumbe;
}
/**
*
* Description:返回具体的周和年份
* @param date
* @return
* @return Map<String,Integer>
* @author name
*
*/
public static Map<String,Integer> getWeekAndYear(String date) {
Map<String,Integer> result = new HashMap<String,Integer>();
Calendar cal = Calendar.getInstance();
//--设置一周的开始,默认是周日,这里设置成星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat formatMon = new SimpleDateFormat("MM");
SimpleDateFormat formatYear = new SimpleDateFormat("yyyy");
Date d = null;
try {
d = format.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
cal.setTime(d);
int month = Integer.valueOf(formatMon.format(d));
int year = Integer.valueOf(formatYear.format(d));
int week = cal.get(Calendar.WEEK_OF_YEAR);
result.put("week", week);
if(week == 1 && month == 12){
result.put("year", year + 1);
}else{
result.put("year", year);
}
System.out.println(result);
return result;
}
}
边栏推荐
- tensorflow实现线性方程的参数调整
- 深度学习--神经网络(基础讲解)
- 实测办公场景下,国产远程控制软件的表现力如何?(技术解析)
- kubernetes中不可见的OOM
- Invisible OOM in kubernetes
- [华为云在线课程][SQL语法分类][数据操作][学习笔记]
- 性能测试(05)-表达式和业务关联-json关联
- Shell script combat (2nd edition) / People's Posts and Telecommunications Press Script 1 Find programs in the PATH
- 在webgis中显示矢量化后的风险防控信息
- Probably 95% of the people are still making PyTorch mistakes
猜你喜欢
Cpolar内网穿透的面板功能介绍
【原创】解决阿里云oss-browser.exe双击没反应打不开,提供一种解决方案
pytorch widedeep文档
Transformer+Embedding+Self-Attention原理详解
OpenSSF's open source software risk assessment tool: Scorecards
Shell script combat (2nd edition) / People's Posts and Telecommunications Press Script 2 Validate input: letters and numbers only
性能测试(05)-表达式和业务关联-json关联
tensorflow实现线性方程的参数调整
shap库源码和代码实现
Probably 95% of the people are still making PyTorch mistakes
随机推荐
unix环境编程 第十四章 14.4 I/O多路转接
使用cpolar远程连接群晖NAS(创建临时链接)
cnn的输入输出
Restful WebServices 学习笔记
How tall is the B+ tree of the MySQL index?
数据存储:对dataframe类,使用to_csv()将中文数据写入csv文件
PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization Paper Reading
autogluon安装,使用指南,代码
[华为云在线课程][SQL语法分类][数据操作][学习笔记]
faster-rcnn中的RPN原理
Received your first five-figure salary
机器学习--线性回归(Linear Regression)
乘积量化(PQ)
使用pip成功安装某个库,但pycharm中找不到,此问题的解决方案
力扣(LeetCode)220. 存在重复元素 III(2022.08.08)
caffe ---make all编辑出错
备份mongodb数据库(认证)
jvm-类加载系统
聚类了解
性能测试(06)-逻辑控制器