package miaosu.utils;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.*;
/**
* @author Administrator
* @Date: 2020/8/7 16:00
* @Description: 获取当前年的每一周
*/
public class GetEveryWeekOfYearUtil {
//获取结算开始时间,例如:20200101 和 获取结算结束时间,例如:20200105
public static Map<String,List<String>> getSettle_StartAndEnd() {
Map<String,List<String>>map=new HashMap<>();
List settle_startList=new ArrayList();
List settle_endList=new ArrayList();
String days=null;
String currentYearStr = getCurrentYear();//当前年
int currentYear = Integer.parseInt(currentYearStr);
//初始化,第一周至少四天,周天数占比
WeekFields wfs = WeekFields.of(DayOfWeek.MONDAY, 4);
//一年最后一天日期的LocalDate,如果该天获得的周数为1或52,那么该年就只有52周,否则就是53周
//获取指定时间所在年的周数
for (int y = 0; y < 10; y++) {//y控制年限
int num = LocalDate.of(currentYear + y, 12, 31).get(wfs.weekOfWeekBasedYear());
num = num == 1 ? 52 : num;
for (int i = 1; i <= num; i++) {//num控制周数
days = getDay(currentYear + y, i, DayOfWeek.MONDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.TUESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.WEDNESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.THURSDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.FRIDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SATURDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SUNDAY);
String[] split = trim(days, ",").split(",");
days = currentYear+y+split[0] ;
String settle_end=currentYear+y+split[split.length - 1];
settle_startList.add(days);
settle_endList.add(settle_end);
}
map.put("settle_start", settle_startList);
map.put("settle_end",settle_endList );
}
return map;
}
//获取每一周:例如20200101~20200105
public static List<String> getEveryWeekOfYearByNum(int number) {
List<String>list=new ArrayList<>();
String days=null;
String currentYearStr = getCurrentYear();//当前年
int currentYear = Integer.parseInt(currentYearStr);
//初始化,第一周至少四天,周天数占比
WeekFields wfs = WeekFields.of(DayOfWeek.MONDAY, 4);
//一年最后一天日期的LocalDate,如果该天获得的周数为1或52,那么该年就只有52周,否则就是53周
//获取指定时间所在年的周数
for (int y = 0; y < number; y++) {//y控制年限
int num = LocalDate.of(currentYear + y, 12, 31).get(wfs.weekOfWeekBasedYear());
num = num == 1 ? 52 : num;
for (int i = 1; i <= num; i++) {//num控制周数
days = getDay(currentYear + y, i, DayOfWeek.MONDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.TUESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.WEDNESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.THURSDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.FRIDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SATURDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SUNDAY);
String[] split = trim(days, ",").split(",");
int i1 = currentYear + y;
days = i1+"年"+split[0] + "~" + i1+"年"+split[split.length - 1];
list.add(days);
}
}
return list;
}
//获取每一周:例如20200101~20200105
public static List<String> getEveryWeekOfYear() {
List<String>list=new ArrayList<>();
String days=null;
String currentYearStr = getCurrentYear();//当前年
int currentYear = Integer.parseInt(currentYearStr);
//初始化,第一周至少四天,周天数占比
WeekFields wfs = WeekFields.of(DayOfWeek.MONDAY, 4);
//一年最后一天日期的LocalDate,如果该天获得的周数为1或52,那么该年就只有52周,否则就是53周
//获取指定时间所在年的周数
for (int y = 0; y < 10; y++) {//y控制年限
int num = LocalDate.of(currentYear + y, 12, 31).get(wfs.weekOfWeekBasedYear());
num = num == 1 ? 52 : num;
for (int i = 1; i <= num; i++) {//num控制周数
days = getDay(currentYear + y, i, DayOfWeek.MONDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.TUESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.WEDNESDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.THURSDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.FRIDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SATURDAY) + "," +
getDay(currentYear + y, i, DayOfWeek.SUNDAY);
String[] split = trim(days, ",").split(",");
int i1 = currentYear + y;
days = i1+"年"+split[0] + "~" + i1+"年"+split[split.length - 1];
list.add(days);
}
}
return list;
}
private static String getDay(Integer year, Integer num, DayOfWeek dayOfWeek) {
//周数小于10在前面补个0
String numStr = num < 10 ? "0" + String.valueOf(num) : String.valueOf(num);
//2019-W01-01获取第一周的周一日期,2019-W02-07获取第二周的周日日期
String weekDate = String.format("%s-W%s-%s", year, numStr, dayOfWeek.getValue());
String date = LocalDate.parse(weekDate, DateTimeFormatter.ISO_WEEK_DATE).toString();
String[] split = date.split("-");
if (!split[0].equals(year.toString())) {
//返回日期范围属于指定年
return "";
}
date = split[1] +"月" + split[2]+"日";
return date;
}
/**
* 去除首尾指定字符
*
* @param str 字符串
* @param element 指定字符
* @return
*/
public static String trim(String str, String element) {
if (str == null || str.equals("")) return str;
boolean beginIndexFlag = true;
boolean endIndexFlag = true;
do {
int beginIndex = str.indexOf(element) == 0 ? 1 : 0;
int endIndex = str.lastIndexOf(element) + 1 == str.length() ? str.lastIndexOf(element) : str.length();
str = str.substring(beginIndex, endIndex);
beginIndexFlag = (str.indexOf(element) == 0);
endIndexFlag = (str.lastIndexOf(element) + 1 == str.length());
} while (beginIndexFlag || endIndexFlag);
return str;
}
//获取当前年
public static String getCurrentYear() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
Date date = new Date();
return sdf.format(date);
}
//获取当前时间所在的周一的日期字符串,now=System.currentTimeMillis()/今天2021-06-17,得到2021-06-14
public static String getWeekOfMONDAY(Long now) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
cld.setTimeInMillis(now);//当前时间/输入的时间周
cld.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//周一
return String.valueOf(Calendar.getInstance().get(Calendar.YEAR))+"-"+df.format(cld.getTime()).substring(5,7)+"-"+df.format(cld.getTime()).substring(8);
}
//获取当前时间所在的周日的日期字符串,now=System.currentTimeMillis()/今天2021-06-17,,得到2021-06-20
public static String getWeekOfSUNDAY(Long now) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
Calendar cld = Calendar.getInstance(Locale.CHINA);
cld.setFirstDayOfWeek(Calendar.MONDAY);//以周一为首日
cld.setTimeInMillis(now);//当前时间/输入的时间周
cld.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//周日
return String.valueOf(Calendar.getInstance().get(Calendar.YEAR))+"-"+df.format(cld.getTime()).substring(5,7)+"-"+ df.format(cld.getTime()).substring(8);
}
//获取当前时间所在月初,今天2021-06-17,,得到2021-06-01
public static String getMonthOfFirst(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar currentMonth = Calendar.getInstance();
currentMonth.set(date.getYear()+1900, date.getMonth(), 1);
return sdf.format(currentMonth.getTime().getTime());
}
//获取日期所在的15号
public static String getMonthOf15(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-15");
Calendar currentMonth = Calendar.getInstance();
currentMonth.set(date.getYear()+1900, date.getMonth(), 1);
return sdf.format(currentMonth.getTime().getTime());
}
//获取日期所在的16号
public static String getMonthOf16(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-16");
Calendar currentMonth = Calendar.getInstance();
currentMonth.set(date.getYear()+1900, date.getMonth(), 1);
return sdf.format(currentMonth.getTime().getTime());
}
//获取当前时间所在月末,今天2021-06-17,,得到2021-06-30
public static String getMonthOfEnd(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar currentMonth = Calendar.getInstance();
currentMonth.set(date.getYear()+1900, date.getMonth()+1, 0);
return sdf.format(currentMonth.getTime().getTime());
}
//获取当前月份年的num年之后的当月月末日期,今天2021-06-17,获取的是num=100,2021-06-30
public static String getYearOfNum(int num){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar currentMonth = Calendar.getInstance();
currentMonth.set(currentMonth.get(Calendar.YEAR)+num, currentMonth.get(Calendar.MONTH), 0);
return sdf.format(currentMonth.getTime());
}
}
08-22