public class DateUtil {
public static final String DATE_FORMAT = "yyyy-MM-dd";
private static SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");
private static SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
/**
* 获取当前时间
*/
public static long getCurrentTime() {
try {
return SystemClock.elapsedRealtime();
} catch (Exception var3) {
var3.printStackTrace();
return System.currentTimeMillis();
}
}
public static String getCurrentTime(String format) {
return new SimpleDateFormat(format).format(new Date(getCurrentTime()));
}
/**
* 获取今天(yyyy-MM-dd)的时间戳
*/
public static long getCurrentDate(Context context) {
String currentTime = DateUtil.getCurrentTime(DateUtil.DATE_FORMAT);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
Date currentDate = df.parse(currentTime);
return currentDate.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return new Date().getTime();
}
/**
* 获取某年第一天日期
*/
public static Date getYearFirst(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
Date currYearFirst = calendar.getTime();
return currYearFirst;
}
/**
* 获取某年最后一天日期
*/
public static Date getYearLast(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
Date currYearLast = calendar.getTime();
return currYearLast;
}
/**
* 获取当前时间所在年的周数
*/
public static int getWeekOfYear(Date date) {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setMinimalDaysInFirstWeek(7);
c.setTime(date);
return c.get(Calendar.WEEK_OF_YEAR);
}
/**
* 获取当前时间所在年的最大周数
*/
public static int getMaxWeekNumOfYear(int year) {
Calendar c = new GregorianCalendar();
c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);
return getWeekOfYear(c.getTime());
}
/**
* 获取某年的第几周的开始日期
*/
public static Date getFirstDayOfWeek(int year, int week) {
Calendar c = getFirstDayOfWeek(year);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE, week * 7);
return getFirstDayOfWeek(cal.getTime());
}
/**
* 获取某年的第几周的结束日期
*/
public static Date getLastDayOfWeek(int year, int week) {
Calendar c = getFirstDayOfWeek(year);
Calendar cal = (GregorianCalendar) c.clone();
cal.add(Calendar.DATE, week * 7);
return getLastDayOfWeek(cal.getTime());
}
/**
* 获取一年开始的第一周的周一
* 第一周如果有四天或以上就算是该年的第一周,
* 否则就是上一年的最后一周(用于跨年判断第一周开始时间)
*/
public static Calendar getFirstDayOfWeek(int year) {
Calendar c = new GregorianCalendar();
c.set(year, Calendar.JANUARY, 1, 0, 0, 0);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
// 如果1月1日是周五,周六或者周日,那么这一周是上一年最后一周,重新计算今年的第一周开始的周一
if (dayOfWeek == Calendar.FRIDAY || dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
c.add(Calendar.DAY_OF_YEAR, 1);
}
}
return c;
}
/**
* 获取当前时间所在周的开始日期
*/
public static Date getFirstDayOfWeek(Date date) {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(date);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday
return c.getTime();
}
/**
* 获取当前时间所在周的结束日期
*/
@SuppressLint("WrongConstant")
public static Date getLastDayOfWeek(Date date) {
Calendar c = new GregorianCalendar();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(date);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
return c.getTime();
}
/**
* 判断该年的最后一天(xxxx年12月31日)所在的周是不是当年的最后一周,
* 否则就是下一年的第一周
*/
public static boolean isLastDayInYearLastWeek(Date lastDate) {
boolean result = false;
Calendar c = new GregorianCalendar();
c.setTime(lastDate);
int lastDay = c.get(Calendar.DAY_OF_WEEK);
// 当lastDay是周四、五、六、日, 它所在周就是是该年的最后一周
if (lastDay == Calendar.THURSDAY || lastDay == Calendar.FRIDAY || lastDay == Calendar.SATURDAY || lastDay == Calendar.SUNDAY) {
result = true;
}
return result;
}
/**
* 获取一年的最后一天
*/
public static Date getLastDayOfYear(int year) {
Calendar c = new GregorianCalendar();
c.set(year, Calendar.DECEMBER, 31, 0, 0, 0);
return c.getTime();
}
/**
* 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (Math.abs(nowTime.getTime() - startTime.getTime()) < 1000 ||
Math.abs(nowTime.getTime() - endTime.getTime()) < 1000) {
return true;
}
Calendar date = new GregorianCalendar();
date.setTime(nowTime);
Calendar begin = new GregorianCalendar();
begin.setTime(startTime);
Calendar end = new GregorianCalendar();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
/**
* 获取一年第一周的第一天 和 最后一周的最后一天
*/
public static Date[] getYearMinDayAndMasDay(int currentYear) {
Date[] resultDate = new Date[2];
List weeks = getWeeksByYear(currentYear);
Week week0 = weeks.get(0);
Week week1 = weeks.get(weeks.size() - 1);
Date minDate = week0.getWeekBeginDate();
Date maxDate = week1.getWeekEndDate();
resultDate[0] = minDate;
resultDate[1] = maxDate;
return resultDate;
}
/**
* 根据当前日期算出所在周的开始时间和结束时间
*/
public static String[] getWeekStartAndEndDay(Date currentDate) {
String[] weekDay = new String[2];
Date firstDayOfWeek = DateUtil.getFirstDayOfWeek(currentDate);
Date lastDayOfWeek = DateUtil.getLastDayOfWeek(currentDate);
weekDay[0] = sdf2.format(firstDayOfWeek.getTime());
weekDay[1] = sdf2.format(lastDayOfWeek.getTime());
return weekDay;
}
/**
* 获取一年中每周的范围
*/
public static List getWeeksByYear(int currentYear) {
ArrayList weekList = new ArrayList<>();
Date lastDay = DateUtil.getLastDayOfYear(currentYear);
boolean result = DateUtil.isLastDayInYearLastWeek(lastDay);
// 一年最多有53个星期
for (int i = 0; i < 53; i++) {
Date firstDayOfWeek = DateUtil.getFirstDayOfWeek(currentYear, i);
Date lastDayOfWeek = DateUtil.getLastDayOfWeek(currentYear, i);
Calendar startCal = Calendar.getInstance();
startCal.setTime(firstDayOfWeek);
Calendar endCal = Calendar.getInstance();
endCal.setTime(lastDayOfWeek);
String WeekNumStr = String.valueOf(i + 1);
if (i < 9) {
WeekNumStr = "0" + (i + 1);
}
Week everyWeek = new Week();
everyWeek.setBeginYear(startCal.get(Calendar.YEAR));
everyWeek.setEndYear(endCal.get(Calendar.YEAR));
everyWeek.setWeekBegin(sdf.format(startCal.getTime()));
everyWeek.setWeekEnd(sdf.format(endCal.getTime()));
everyWeek.setWeekNum(WeekNumStr);
if (i <= 50) {
weekList.add(everyWeek);
}
if (i > 50) {
// 判断最后一天是否在这区间内
if (DateUtil.isEffectiveDate(lastDay, firstDayOfWeek, lastDayOfWeek)) {
// 判断该年的最后一天(xxxx年12月31日)所在的周是不是当年的最后一周
if (result) {
weekList.add(everyWeek);
}
break;
} else {
weekList.add(everyWeek);
}
}
}
return weekList;
}
}