|
@@ -0,0 +1,665 @@
|
|
|
+package com.ruoyi.common.utils;
|
|
|
+
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.DayOfWeek;
|
|
|
+import java.time.Duration;
|
|
|
+import java.time.Instant;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
+import java.time.temporal.TemporalAdjusters;
|
|
|
+import java.time.temporal.WeekFields;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * The type Date time util.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+public class DateTimeUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Current date time string.
|
|
|
+ *
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String currentDateTime() {
|
|
|
+ return DateTimeUtil.currentDateTime(DateFormatter.yyyy_MM_dd_HHmmss);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date date.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @return the date
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Date parseDate(String dateString) {
|
|
|
+ return DateTimeUtil.parseDate(dateString, DateFormatter.yyyy_MM_dd_HHmmss);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date date.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the date
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Date parseDate(String dateString, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
|
|
|
+ Instant instant = dateTime.atZone(ZoneId.of("GMT+08:00")).toInstant();
|
|
|
+ return Date.from(instant);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Minus day date.
|
|
|
+ *
|
|
|
+ * @param dayNum the day num
|
|
|
+ * @return the date
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Date minusDay(Long dayNum) {
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ Instant instant = now.atZone(ZoneId.of("GMT+08:00")).toInstant();
|
|
|
+ return Date.from(instant);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date string.
|
|
|
+ *
|
|
|
+ * @param localDateTime the local date time
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String parseDate(LocalDateTime localDateTime, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ return localDateTime.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date string.
|
|
|
+ *
|
|
|
+ * @param localDate the local date
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String parseDate(LocalDate localDate, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ return localDate.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Current date time string.
|
|
|
+ *
|
|
|
+ * @param format the format
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String currentDateTime(String format) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ return now.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Integer getStepIndexFromMills(Integer step, long mills) {
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(mills), ZoneId.systemDefault());
|
|
|
+ int hour = localDateTime.getHour();
|
|
|
+ int second = localDateTime.getSecond();
|
|
|
+ return hour * 60 * 60 / step + second / step;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getDateFromMills(long mills, String formatRegex) {
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(mills), ZoneId.systemDefault());
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ return localDateTime.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getDateFromMills(long mills) {
|
|
|
+ return getDateFromMills(mills, DateFormatter.yyyy_MM_dd_HHmmss);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse local date local date time.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the local date time
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static LocalDateTime parseLocalDateTime(String dateString, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
|
|
|
+ return dateTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static long timestampMillis() {
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.now();
|
|
|
+ // 将 LocalDateTime 转换为 Instant
|
|
|
+ Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
|
|
+ // 获取毫秒时间戳
|
|
|
+ return instant.toEpochMilli();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse local date local date.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the local date
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static LocalDate parseLocalDate(String dateString, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegex);
|
|
|
+ LocalDate dateTime = LocalDate.parse(dateString, formatter);
|
|
|
+ return dateTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date string string.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String parseDateString(String dateString, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateFormatter.yyyy_MM_dd_HHmmss);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
|
|
|
+ return parseDate(dateTime, formatRegex);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse date string string.
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param srcFormatRegex the src format regex
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String parseDateString(String dateString, String srcFormatRegex, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(srcFormatRegex);
|
|
|
+ LocalDateTime dateTime = LocalDateTime.parse(dateString, formatter);
|
|
|
+ return parseDate(dateTime, formatRegex);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Parse short date string string(yyyyMMdd).
|
|
|
+ *
|
|
|
+ * @param dateString the date string
|
|
|
+ * @param srcFormatRegex the src format regex
|
|
|
+ * @param formatRegex the format regex
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String parseShortDateString(String dateString, String srcFormatRegex, String formatRegex) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(srcFormatRegex);
|
|
|
+ LocalDate date = LocalDate.parse(dateString, formatter);
|
|
|
+ return parseDate(date, formatRegex);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Days of range list.
|
|
|
+ *
|
|
|
+ * @param startDate the start date
|
|
|
+ * @param endDate the end date DateTimeUtil.daysOfRange("2020-05-06",
|
|
|
+ * "2020-09-02",DateFormatter.yyyy_MM_dd,DateFormatter.yyyyMMdd)
|
|
|
+ * @return the list
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static List<String> daysOfRange(String startDate, String endDate) {
|
|
|
+ return daysOfRange(startDate, endDate, DateFormatter.yyyy_MM_dd, DateFormatter.yyyy_MM_dd);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Minus month string.
|
|
|
+ *
|
|
|
+ * @param monthNum the month num
|
|
|
+ * @param formatRegx the format regx
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String minusMonth(Long monthNum, String formatRegx) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegx);
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ now = now.minusMonths(monthNum);
|
|
|
+ return now.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Minus month string
|
|
|
+ *
|
|
|
+ * @param monthNum month num
|
|
|
+ * @param formatRegx format regx
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String minusMonth(Integer monthNum, String formatRegx) {
|
|
|
+ return minusMonth(monthNum.longValue(), formatRegx);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Yesterday string.
|
|
|
+ *
|
|
|
+ * @param formatRegx the format regx
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String yesterday(String formatRegx) {
|
|
|
+ return minusDay(1L, formatRegx);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Minus month string.
|
|
|
+ *
|
|
|
+ * @param monthNum the month num
|
|
|
+ * @param formatRegx the format regx
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String minusMonth(String date, String formatRegx, Long monthNum) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegx);
|
|
|
+ LocalDateTime localDateTime = parseLocalDateTime(date, formatRegx);
|
|
|
+ localDateTime = localDateTime.minusMonths(monthNum);
|
|
|
+ return localDateTime.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Date minus month string
|
|
|
+ *
|
|
|
+ * @param date date
|
|
|
+ * @param formatRegx format regx
|
|
|
+ * @param monthNum month num
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String dateMinusMonth(String date, String formatRegx, Long monthNum) {
|
|
|
+ return dateMinusMonth(date, DateFormatter.yyyyMMdd, formatRegx, monthNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Date minus month string
|
|
|
+ *
|
|
|
+ * @param date date
|
|
|
+ * @param srcFormatRegx src format regx
|
|
|
+ * @param formatRegx format regx
|
|
|
+ * @param monthNum month num
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String dateMinusMonth(String date, String srcFormatRegx, String formatRegx, Long monthNum) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegx);
|
|
|
+ LocalDate localDateTime = parseLocalDate(date, srcFormatRegx);
|
|
|
+ localDateTime = localDateTime.minusMonths(monthNum);
|
|
|
+ return localDateTime.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Minus day string.
|
|
|
+ *
|
|
|
+ * @param dayNum the day num
|
|
|
+ * @param formatRegx the format regx
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String minusDay(Long dayNum, String formatRegx) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatRegx);
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ now = now.minusDays(dayNum);
|
|
|
+ return now.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Days of range list.
|
|
|
+ *
|
|
|
+ * @param startDate the start date
|
|
|
+ * @param endDate the end date
|
|
|
+ * @param paramFormat the param format
|
|
|
+ * @param resultFormat the result format
|
|
|
+ * @return the list
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static List<String> daysOfRange(String startDate, String endDate, String paramFormat, String resultFormat) {
|
|
|
+ DateTimeFormatter resultFormatter = DateTimeFormatter.ofPattern(resultFormat);
|
|
|
+ DateTimeFormatter paramFormatter = DateTimeFormatter.ofPattern(paramFormat);
|
|
|
+ LocalDate dateTimeOfStart = LocalDate.parse(startDate, paramFormatter);
|
|
|
+ LocalDate dateTimeOfEnd = LocalDate.parse(endDate, paramFormatter);
|
|
|
+ List<String> days = new ArrayList<>();
|
|
|
+ while (!dateTimeOfStart.isAfter(dateTimeOfEnd)) {
|
|
|
+ days.add(dateTimeOfStart.format(resultFormatter));
|
|
|
+ dateTimeOfStart = dateTimeOfStart.plusDays(1L);
|
|
|
+ }
|
|
|
+ return days;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<String> monthOfRange(String startDate, String endDate, String paramFormat, String resultFormat) {
|
|
|
+ DateTimeFormatter resultFormatter = DateTimeFormatter.ofPattern(resultFormat);
|
|
|
+ DateTimeFormatter paramFormatter = DateTimeFormatter.ofPattern(paramFormat);
|
|
|
+ LocalDate dateTimeOfStart = LocalDate.parse(startDate, paramFormatter);
|
|
|
+ LocalDate dateTimeOfEnd = LocalDate.parse(endDate, paramFormatter);
|
|
|
+ List<String> month = new ArrayList<>();
|
|
|
+ while (!dateTimeOfStart.isAfter(dateTimeOfEnd)) {
|
|
|
+ month.add(dateTimeOfStart.format(resultFormatter));
|
|
|
+ dateTimeOfStart = dateTimeOfStart.plusMonths(1L);
|
|
|
+ }
|
|
|
+ DateTimeFormatter ddFormatter = DateTimeFormatter.ofPattern(DateFormatter.DD);
|
|
|
+ int startDd = Integer.parseInt(dateTimeOfStart.format(ddFormatter));
|
|
|
+ int endDd = Integer.parseInt(dateTimeOfEnd.format(ddFormatter));
|
|
|
+ if (startDd > endDd) {
|
|
|
+ month.add(dateTimeOfEnd.format(resultFormatter));
|
|
|
+ }
|
|
|
+ return month;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Days of range list.
|
|
|
+ *
|
|
|
+ * @param startDate the start date
|
|
|
+ * @param endDate the end date
|
|
|
+ * @param paramFormat the param format
|
|
|
+ * @return the list
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static List<String> daysOfRange(String startDate, String endDate, String paramFormat) {
|
|
|
+ DateTimeFormatter resultFormatter = DateTimeFormatter.ofPattern(paramFormat);
|
|
|
+ DateTimeFormatter paramFormatter = DateTimeFormatter.ofPattern(paramFormat);
|
|
|
+ LocalDate dateTimeOfStart = LocalDate.parse(startDate, paramFormatter);
|
|
|
+ LocalDate dateTimeOfEnd = LocalDate.parse(endDate, paramFormatter);
|
|
|
+ List<String> days = new ArrayList<>();
|
|
|
+ while (!dateTimeOfStart.isAfter(dateTimeOfEnd)) {
|
|
|
+ days.add(dateTimeOfStart.format(resultFormatter));
|
|
|
+ dateTimeOfStart = dateTimeOfStart.plusDays(1L);
|
|
|
+ }
|
|
|
+ return days;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets time step of time index.
|
|
|
+ *
|
|
|
+ * @param tp the tp
|
|
|
+ * @param gap the gap (now + gap minutes)
|
|
|
+ * @return the time step of time index
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer getTimeStepOfTimeIndex(Integer tp, Integer gap) {
|
|
|
+ return getTimeStepIndexOfNow(tp, LocalDateTime.now().plus(gap, ChronoUnit.MINUTES));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get time step index of now integer.
|
|
|
+ *
|
|
|
+ * @param tp the tp
|
|
|
+ * @param toDateTime the to date time
|
|
|
+ * @return the integer
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static int getTimeStepIndexOfNow(Integer tp, LocalDateTime toDateTime) {
|
|
|
+ LocalDateTime zero = LocalDateTime.of(toDateTime.getYear(), toDateTime.getMonth(), toDateTime.getDayOfMonth(), 0, 0, 0);
|
|
|
+ Duration duration = Duration.between(zero, toDateTime);
|
|
|
+ double minutes = duration.toMinutes();
|
|
|
+ return (int) Math.floor(minutes / tp);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets time from step index. tp is min the format hh:mm:00
|
|
|
+ *
|
|
|
+ * @param stepIndex the step index
|
|
|
+ * @param tp the tp
|
|
|
+ * @return the time from step index
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String getTimeFromStepIndex(Integer stepIndex, Integer tp) {
|
|
|
+ Integer stepIndex2Min = stepIndex * tp;
|
|
|
+ String hour = StringUtils.leftPad(String.valueOf(stepIndex2Min / 60), 2, "0");
|
|
|
+ String min = StringUtils.leftPad(String.valueOf(stepIndex2Min % 60), 2, "0");
|
|
|
+ return String.format("%s:%s:%s", hour, min, "00");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets time from step index with out second.
|
|
|
+ *
|
|
|
+ * @param stepIndex the step index
|
|
|
+ * @param tp the tp
|
|
|
+ * @return the time from step index with out second
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String getTimeFromStepIndexWithOutSecond(Integer stepIndex, Integer tp) {
|
|
|
+ Integer stepIndex2Min = stepIndex * tp;
|
|
|
+ String hour = StringUtils.leftPad(String.valueOf(stepIndex2Min / 60), 2, "0");
|
|
|
+ String min = StringUtils.leftPad(String.valueOf(stepIndex2Min % 60), 2, "0");
|
|
|
+ return String.format("%s:%s", hour, min);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets day of week.
|
|
|
+ *
|
|
|
+ * @param date the date
|
|
|
+ * @param paramFormatter the param formatter
|
|
|
+ * @return the day of week
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer getDayOfWeek(String date, String paramFormatter) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(paramFormatter);
|
|
|
+ LocalDate l_da1 = LocalDate.parse(date, formatter);
|
|
|
+ DayOfWeek dayOfWeek = l_da1.getDayOfWeek();
|
|
|
+ return dayOfWeek.getValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets ali day of week.
|
|
|
+ *
|
|
|
+ * @param date the date
|
|
|
+ * @return the ali day of week
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer getAliDayOfWeek(String date) {
|
|
|
+ return getDayOfWeek(date, DateFormatter.yyyyMMdd) - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Cal week of year integer.
|
|
|
+ *
|
|
|
+ * @return the integer
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer calWeekOfYear() {
|
|
|
+ return calWeekOfYear(currentDateTime(DateFormatter.yyyy_MM_dd));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Integer calLastWeekOfYear() {
|
|
|
+ return calWeekOfYear(currentDateTime(DateFormatter.yyyy_MM_dd)) - 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Cal week of year integer.
|
|
|
+ *
|
|
|
+ * @param date the date yyyy-MM-dd
|
|
|
+ * @return the integer
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer calWeekOfYear(String date) {
|
|
|
+ LocalDate localDate = LocalDate.parse(date);
|
|
|
+ // 第一个参数:一周的第一天,不能为空
|
|
|
+ // 第二个参数:第一周的最小天数,从1到7
|
|
|
+ WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY, 1);
|
|
|
+ return localDate.get(weekFields.weekOfYear());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Cal week of year integer.
|
|
|
+ *
|
|
|
+ * @param date the date
|
|
|
+ * @param paramFormatter the param formatter
|
|
|
+ * @return the integer
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static Integer calWeekOfYear(String date, String paramFormatter) {
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(paramFormatter);
|
|
|
+ LocalDate localDate = LocalDate.parse(date, formatter);
|
|
|
+
|
|
|
+ return calWeekOfYear(localDate.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get week time section string [ ].
|
|
|
+ *
|
|
|
+ * @param weekIndex the week index
|
|
|
+ * @return the string [ ]
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String[] getWeekTimeSection(int weekIndex) {
|
|
|
+ return getWeekTimeSection(weekIndex, DateFormatter.yyyyMMdd);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Get week time section string [ ]. 获取前几周内的日期范围
|
|
|
+ *
|
|
|
+ * @param weekIndex the week index
|
|
|
+ * @return the string [ ]
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public static String[] getWeekTimeSection(int weekIndex, String dateFormat) {
|
|
|
+ // weekIndex为前几周的周数,如:获取当前时间前第二周的时间 weekIndex=2
|
|
|
+ // 获取本周第一天
|
|
|
+ Calendar cal = Calendar.getInstance();
|
|
|
+ cal.add(Calendar.WEEK_OF_MONTH, 0);
|
|
|
+ cal.set(Calendar.DAY_OF_WEEK, 2);
|
|
|
+ Date first = cal.getTime();
|
|
|
+ Date last = cal.getTime();
|
|
|
+ String firstString = new SimpleDateFormat("yyyy-MM-dd").format(first) + " 00:00:00";
|
|
|
+ String lastString = new SimpleDateFormat("yyyy-MM-dd").format(last) + " 23:59:59";
|
|
|
+ DateTimeFormatter formatPatten = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ LocalDateTime firstTime = LocalDateTime.parse(firstString, formatPatten);
|
|
|
+ LocalDateTime lastTime = LocalDateTime.parse(lastString, formatPatten);
|
|
|
+ DateTimeFormatter resultDateFormat = DateTimeFormatter.ofPattern(dateFormat);
|
|
|
+ // 开始时间
|
|
|
+ firstTime = firstTime.plusDays(-(weekIndex * 7L));
|
|
|
+ // 结束时间
|
|
|
+ lastTime = lastTime.plusDays(-1);
|
|
|
+ return new String[]{firstTime.format(resultDateFormat), lastTime.format(resultDateFormat)};
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFirstDayOfRecentYear(String dateFormat) {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 计算近一年的年份
|
|
|
+ int recentYear = today.getYear() - 1;
|
|
|
+
|
|
|
+ LocalDate localDate = LocalDate.of(recentYear, today.getMonth(), 1);
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
|
|
|
+ return localDate.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFirstDayOfThisYear(String dateFormat) {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
+ // 计算近一年的年份
|
|
|
+ int recentYear = today.getYear();
|
|
|
+
|
|
|
+ // 使用 TemporalAdjusters 来找到近一年的第一天
|
|
|
+ LocalDate localDate = LocalDate.of(recentYear, 1, 1).with(TemporalAdjusters.firstDayOfYear());
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
|
|
|
+ return localDate.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFirstDayOfRecentYear() {
|
|
|
+ return getFirstDayOfRecentYear(DateFormatter.yyyy_MM_dd);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFirstDayOfRecentMonth(String dateFormat) {
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ // 使用 TemporalAdjusters 来找到近一个月的第一天
|
|
|
+ LocalDate with = today.minusMonths(1);
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
|
|
|
+ return with.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getFirstDayOfRecentMonth() {
|
|
|
+ return getFirstDayOfRecentMonth(DateFormatter.yyyy_MM_dd);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ System.out.println(DateTimeUtil.getStepIndexFromMills(10, System.currentTimeMillis()));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The interface Date formatter.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ public interface DateFormatter {
|
|
|
+ /**
|
|
|
+ * The constant yyyy_MM_dd_HHmmss.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyy_MM_dd_HHmmss = "yyyy-MM-dd HH:mm:ss";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The constant yyyyMMddHHmmss.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyyMMddHHmmss = "yyyyMMddHHmmss";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The constant yyyy_MM_dd.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyy_MM_dd = "yyyy-MM-dd";
|
|
|
+
|
|
|
+ String DD = "dd";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The constant yyyyMMdd.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyyMMdd = "yyyyMMdd";
|
|
|
+
|
|
|
+ String yyyy_MM = "yyyy-MM";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The constant yyyyMM.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyyMM = "yyyyMM";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The constant yyyy.
|
|
|
+ *
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ String yyyy = "yyyy";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * To string string.
|
|
|
+ *
|
|
|
+ * @return the string
|
|
|
+ * @author chen.cheng
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ String toString();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|