package com.irrigation.icl.utils;
import java.text.ParseException;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
/**
* 日期工具类
*
* @version 1.0.1
*/
public class DateUtils {
/**
* 当前时间,转换为{@link Date}对象
*
* @return 当前时间
*/
public static Date date() {
return date(currentTimeMillis());
}
/**
* 获取时间
*
* @param date 时间戳
* @return
*/
public static Date date(Long date) {
return new Date(date);
}
/**
* 获取指定某一天的开始时间戳
*
* @param date
* @return
*/
public static Date getDailyStartTime(Date date) {
Calendar calendar = calendar(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
/**
* 获取指定某一天的结束时间戳
*
* @param date
* @return
*/
public static Date getDailyEndTime(Date date) {
Calendar calendar = calendar(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
/**
* 日期加减
*
* @param date
* @param field 对应 Calendar 常量
* @param amount
* @return
*/
public static Date dateFieldAdd(Date date, int field, int amount) {
Calendar calendar = calendar(date);
calendar.add(field, amount);
return calendar.getTime();
}
/**
* 创建Calendar对象,时间为默认时区的当前时间
*
* @return Calendar对象
* @since 4.6.6
*/
public static Calendar calendar() {
return Calendar.getInstance();
}
/**
* 转换为Calendar对象
*
* @param date 日期对象
* @return Calendar对象
*/
public static Calendar calendar(Date date) {
return calendar(date.getTime());
}
/**
* 转换为Calendar对象
*
* @param millis 时间戳
* @return Calendar对象
*/
public static Calendar calendar(long millis) {
final Calendar cal = calendar();
cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
cal.setTimeInMillis(millis);
return cal;
}
private static Calendar toCalendar(Date date) {
return toCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT), date);
}
private static Calendar toCalendar(TimeZone zone, Locale locale, Date date) {
if (null == locale) {
locale = Locale.getDefault(Locale.Category.FORMAT);
}
final Calendar cal = (null != zone) ? Calendar.getInstance(zone, locale) : Calendar.getInstance(locale);
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setTime(date);
return cal;
}
/**
* 当前时间的时间戳
*
* @return 时间
*/
public static long currentTimeMillis() {
return System.currentTimeMillis();
}
/**
* 当前时间的时间戳(秒)
*
* @return 当前时间秒数
*/
public static long currentSeconds() {
return System.currentTimeMillis() / 1000;
}
/**
* 获得年的部分
*
* @param date 日期
* @return 年的部分
*/
public static int year(Date date) {
return toCalendar(date).get(Calendar.YEAR);
}
/**
* 获得指定日期所属季度,从1开始计数
*
* @param date 日期
* @return 第几个季度
* @since 4.1.0
*/
public static int quarter(Date date) {
return month(date) / 3 + 1;
}
/**
* 获得月份,从0开始计数
*
* @param date 日期
* @return 月份,从0开始计数
*/
public static int month(Date date) {
return toCalendar(date).get(Calendar.MONTH);
}
/**
* 获得指定日期是所在年份的第几周
*
* @param date 日期
* @return 周
*/
public static int weekOfYear(Date date) {
return toCalendar(date).get(Calendar.WEEK_OF_YEAR);
}
/**
* 获得指定日期是所在月份的第几周
*
* @param date 日期
* @return 周
*/
public static int weekOfMonth(Date date) {
return toCalendar(date).get(Calendar.WEEK_OF_MONTH);
}
/**
* 获得指定日期是这个日期所在月份的第几天
*
* @param date 日期
* @return 天
*/
public static int dayOfMonth(Date date) {
return toCalendar(date).get(Calendar.DAY_OF_MONTH);
}
/**
* 获得指定日期是星期几,1表示周日,2表示周一
*
* @param date 日期
* @return 天
*/
public static int dayOfWeek(Date date) {
return toCalendar(date).get(Calendar.DAY_OF_WEEK);
}
/**
* 获得指定日期的小时数部分
*
* @param date 日期
* @return 小时数
*/
public static int hour(Date date) {
return toCalendar(date).get(Calendar.HOUR_OF_DAY);
}
/**
* 获得指定日期的分钟数部分
* 例如:10:04:15.250 =》 4
*
* @param date 日期
* @return 分钟数
*/
public static int minute(Date date) {
return toCalendar(date).get(Calendar.MINUTE);
}
/**
* 获得指定日期的秒数部分
*
* @param date 日期
* @return 秒数
*/
public static int second(Date date) {
return toCalendar(date).get(Calendar.SECOND);
}
/**
* 获得指定日期的毫秒数部分
*
* @param date 日期
* @return 毫秒数
*/
public static int millisecond(Date date) {
return toCalendar(date).get(Calendar.MILLISECOND);
}
/**
* 当前时间,格式 yyyy-MM-dd HH:mm:ss
*
* @return 当前时间的标准形式字符串
*/
public static String now() {
return formatDateTime(new Date());
}
/**
* 当前日期,格式 yyyy-MM-dd
*
* @return 当前日期的标准形式字符串
*/
public static String today() {
return formatDate(new Date());
}
// ------------------------------------ Format start ----------------------------------------------
/**
* 根据特定格式格式化日期
*
* @param date 被格式化的日期
* @param pattern 日期格式,常用格式见:
* @return 格式化后的字符串
* @see DatePatternUtils
*/
public static String format(Date date, String pattern) {
if (null == date || ObjectUtils.stringIsEmpty(pattern)) {
return null;
}
return DateFormatUtils.getInstance(pattern).format(date);
}
/**
* 格式化日期时间
* 格式 yyyy-MM-dd HH:mm:ss
*
* @param date 被格式化的日期
* @return 格式化后的日期
*/
public static String formatDateTime(Date date) {
if (null == date) {
return null;
}
return DateFormatUtils.NORM_DATETIME_FORMAT.format(date);
}
/**
* 格式化日期部分(不包括时间)
* 格式 yyyy-MM-dd
*
* @param date 被格式化的日期
* @return 格式化后的字符串
*/
public static String formatDate(Date date) {
if (null == date) {
return null;
}
return DateFormatUtils.NORM_DATE_FORMAT.format(date);
}
/**
* 格式化时间
* 格式 HH:mm:ss
*
* @param date 被格式化的日期
* @return 格式化后的字符串
* @since 3.0.1
*/
public static String formatTime(Date date) {
if (null == date) {
return null;
}
return DateFormatUtils.NORM_TIME_FORMAT.format(date);
}
/**
* 格式化给定样式
*
* @param timestamp
* @param pattern
* @return
* @see DatePatternUtils
*/
public static String format(Long timestamp, String pattern) {
if (ObjectUtils.isNull(timestamp) || ObjectUtils.isNull(pattern)) {
return null;
}
return DateFormatUtils.getInstance(pattern).format(date(timestamp));
}
// ------------------------------------ Format end ----------------------------------------------
// ------------------------------------ Parse start ----------------------------------------------
/**
* 构建DateTime对象
*
* @param dateStr Date字符串
* @param pattern 格式
* @return DateTime对象
* @see DatePatternUtils
*/
public static Date parse(String dateStr, String pattern) {
try {
return DateFormatUtils.getInstance(pattern).parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 将特定格式的日期转换为Date对象
*
* @param dateStr 特定格式的日期
* @param pattern 格式,例如yyyy-MM-dd
* @param locale 区域信息
* @return 日期对象
* @see DatePatternUtils
* @since 4.5.18
*/
public static Date parse(String dateStr, String pattern, Locale locale) {
try {
return DateFormatUtils.getInstance(pattern, locale).parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 格式yyyy-MM-dd HH:mm:ss
*
* @param dateString 标准形式的时间字符串
* @return 日期对象
*/
public static Date parseDateTime(String dateString) {
return parse(dateString, DatePatternUtils.NORM_DATETIME_PATTERN);
}
/**
* 解析格式为yyyy-MM-dd的日期,忽略时分秒
*
* @param dateString 标准形式的日期字符串
* @return 日期对象
*/
public static Date parseDate(String dateString) {
return parse(dateString, DatePatternUtils.NORM_DATE_PATTERN);
}
/**
* 解析时间,格式HH:mm:ss,日期部分默认为1970-01-01
*
* @param timeString 标准形式的日期字符串
* @return 日期对象
*/
public static Date parseTime(String timeString) {
return parse(timeString, DatePatternUtils.NORM_TIME_PATTERN);
}
// ------------------------------------ Parse end ----------------------------------------------
/**
* date 转换为 long
*
* @param date
* @return
*/
public static long dateToLong(Date date) {
return ObjectUtils.isNull(date) ? 0L : date.getTime();
}
/**
* 时间字符串转换long
*
* @param dateStr
* @param pattern
* @return
* @see DatePatternUtils
*/
public static long dateToLong(String dateStr, String pattern) {
if (ObjectUtils.isNull(dateStr) || ObjectUtils.isNull(pattern)) {
return 0L;
}
return parse(dateStr, pattern).getTime();
}
//---------------------new api
/**
* 获取指定天的北京时间戳为00:00:00的日期
*
* @param year
* @param month
* @param day
* @return
*/
public static Date getStartTimeOfDay(int year, int month, int day) {
LocalDate localDate = LocalDate.of(year, month, day);
Instant instant = localDate.atStartOfDay(ZoneId.of("Asia/Shanghai")).toInstant();
return Date.from(instant);
}
/**
* 获取某月中第一天北京时间戳为00:00:00的日期
*
* @param year
* @param month
* @return
*/
public static Date getStartDateOfMonth(int year, int month) {
return getStartTimeOfDay(year, month, 1);
}
/**
* 获取某月中最后一天北京时间为23:59:59.999的日期
*
* @param year
* @param month
* @return
*/
public static Date getEndDateOfMonth(int year, int month) {
YearMonth yearMonth = YearMonth.of(year, month);
LocalDate endOfMonth = yearMonth.atEndOfMonth();
LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999);
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
return Date.from(zonedDateTime.toInstant());
}
/**
* 获得指定年北京时间0点的开始时间戳
*
* @param year
* @return
*/
public static long getYearStartMilliseconds(Integer year) {
return LocalDateTime.of(year, 1, 1, 0, 0, 0, 0).toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 获得指定年北京时间最后一毫秒的时间戳
*
* @param year
* @return
*/
public static long getYearEndMilliseconds(Integer year) {
return getYearStartMilliseconds(year + 1) - 1;
}
/**
* 获得指定日期北京时间0点的时间戳
*
* @param year
* @param month
* @param day
* @return
*/
public static long getDayStartMilliseconds(Integer year, Integer month, Integer day) {
return LocalDateTime.of(year, month, day, 0, 0, 0, 0).toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 获取指定日期北京时间23:59:59.999的时间戳
*
* @param year
* @param month
* @param day
* @return
*/
public static long getDayEndMilliseconds(Integer year, Integer month, Integer day) {
return LocalDateTime.of(year, month, day, 23, 59, 59, 999).toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 获取传入时间戳所指向日期北京时间0点的时间戳
*
* @param timestamp
* @return
*/
public static long getDayStartTimeStamp(Long timestamp) {
LocalDateTime time2 = LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
LocalDate localDate = time2.toLocalDate();
return localDate.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
/**
* 获取传入时间戳所指向日期北京时间23:59:59.999的时间戳
*
* @param timestamp
* @return
*/
public static long getDayEndTimeStamp(Long timestamp) {
LocalDateTime time2 = LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8)).plusDays(1L);
LocalDate localDate = time2.toLocalDate();
return localDate.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli() - 1L;
}
/**
* 获取指定月北京时间1月1日0点的时间戳
*
* @param month
* @return
*/
public static long getStartTimestampOfMonth(int month) {
YearMonth yearMonth = YearMonth.now(ZoneId.of("Asia/Shanghai"));
return getDayStartMilliseconds(yearMonth.getYear(), month, 1);
}
/**
* 获取当年一月的格式化字符串 yyyy-MM
*
* @return
*/
public static String getJanuary() {
YearMonth yearMonth = YearMonth.now().withMonth(1);
return yearMonth.format(DateTimeFormatter.ofPattern(DatePatternUtils.NORM_YM_PATTERN));
}
/**
* 获取当月格式化字符串 yyyy-MM
*
* @return
*/
public static String getCurrentMonth() {
LocalDate now = LocalDate.now(ZoneId.of("Asia/Shanghai"));
return now.format(DateTimeFormatter.ofPattern(DatePatternUtils.NORM_YM_PATTERN));
}
/**
* 通过时间戳获取前一日北京日期
*
* @param timestamp
* @return
*/
public static Date yesterday(Long timestamp) {
LocalDateTime time2 = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of("Asia/Shanghai")).minusDays(1L);
return Date.from(time2.toInstant(ZoneOffset.ofHours(8)));
}
/**
* 将时间戳转换为北京日期
*
* @param timestamp
* @return
*/
public static Date convertTimestampToDate(Long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.ofHours(8)).toInstant();
return Date.from(instant);
}
/**
* 获取timestamp+8小时的日期,专用于MongoDB查询
*
* @param timestamp
* @return
*/
public static Date getYesterdayUtcDate(Long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp).plus(8L, ChronoUnit.HOURS).minus(1L, ChronoUnit.DAYS);
return Date.from(instant);
}
/**
* 获取+8小时时间戳的日期,专用于MongoDB查询
*
* @param timestamp
* @return
*/
public static Date convertTimestampToUtcDate(Long timestamp) {
Instant instant = Instant.ofEpochMilli(timestamp).plus(8, ChronoUnit.HOURS);
return Date.from(instant);
}
/**
* 获取日期
*
* @return 如:2014-12-10
*/
public static LocalDate getLocalDateNow() {
return LocalDate.now();
}
/**
* 获取日期
*
* @param year
* @param month
* @param dayOfMont
* @return 如:2014-12-10
*/
public static LocalDate getLocalDate(int year, int month, int dayOfMont) {
return LocalDate.of(year, month, dayOfMont);
}
/**
* 获取时间
*
* @return 如:14:29:40.558
*/
public static LocalTime getLocalTimeNow() {
return LocalTime.now();
}
/**
* 获取时间
*
* @return 14:29:40
*/
public static LocalTime getLocalTimeNowOfSecond() {
return getLocalTimeNow().withNano(0);
}
/**
* 获取指定时间
*
* @param hour
* @param minute
* @param second
* @param nanoOfSecond
* @return
*/
public static LocalTime getLocalTime(int hour, int minute, int second, int nanoOfSecond) {
return LocalTime.of(hour, minute, second, nanoOfSecond);
}
/**
* 获取时间和日期
*
* @return 如:2016-11-06T15:20:27.996
*/
public static LocalDateTime getLocalDateTimeNow() {
return LocalDateTime.now();
}
/**
* 获取时间和日期
*
* @param year
* @param month
* @param dayOfMonth
* @param hour
* @param minute
* @param second
* @param nanoOfSecond
* @return
*/
public static LocalDateTime getLocalDateTime(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
return LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
}
/**
* LocalDateTime 格式化
*
* @param localDateTime
* @param pattern
* @return
* @see DatePatternUtils
*/
public static String format(LocalDateTime localDateTime, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return dateTimeFormatter.format(localDateTime);
}
/**
* LocalDate 格式化
*
* @param localDate
* @param pattern
* @return
*/
public static String format(LocalDate localDate, String pattern) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
return dateTimeFormatter.format(localDate);
}
/**
* 获取当前时间字符串 :2019-09-01
* @return
*/
public static String formatDateNow() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePatternUtils.NORM_DATE_PATTERN);
return dateTimeFormatter.format(getLocalDateNow());
}
}