package com.hmily.tcc.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Timestamp;
import java.text.ParseException;
import java.time.Clock;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
/**
* 日期操作类.
*
* @author xiaoyu
*/
public class DateUtils {
public static final Logger LOGGER = LoggerFactory.getLogger(DateUtils.class);
/**
* 要用到的DATE Format的定义.
*/
public static final String DATE_FORMAT_DATEONLY = "yyyy-MM-dd";
public static final String DATE_FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_FORMAT_DATETIME14 = "yyyyMMddHHmmss";
public static final String SHORTDATEFORMAT = "yyyyMMdd";
public static final String HMS_FORMAT = "HH:mm:ss";
private static final ZoneId UTC_ZONE = ZoneOffset.UTC.normalized();
private static final ZoneId DEFAULT_ZONE = ZoneId.systemDefault();
private static final Integer QUARTER_FIRST = 1;
private static final Integer QUARTER_SECOND = 2;
private static final Integer QUARTER_THIRD = 3;
private static final Integer QUARTER_FOURTH = 4;
/**
* 把字符串转成日期类型.
* 输入的日期格式:yyyy-MM-dd HH:mm:ss
*
* @param str 日期字符串
* @return 转换后的日期
* @throws ParseException 异常
* @see LocalDateTime
*/
public static LocalDateTime parseLocalDateTime(final String str) throws ParseException {
return LocalDateTime.parse(str, DateTimeFormatter.ofPattern(DATE_FORMAT_DATETIME));
}
public static Date getDateYYYY() throws ParseException{
LocalDateTime localDateTime = parseLocalDateTime(getCurrentDateTime());
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
public static String parseDate(Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return formaterLocalDateTime(localDateTime);
}
/**
* 把字符串转成特定格式的日期类型.
* 输入的日期格式:yyyy-MM-dd HH:mm:ss
* @param dateFormat 日期字符串
* @param str 日期字符串
* @return 转换后的日期
* @throws ParseException 转换异常
* @see LocalDateTime
*/
public static LocalDateTime parseLocalDateTime(final String str, final String dateFormat) throws ParseException {
LocalDateTime localDateTime = LocalDateTime.parse(str, DateTimeFormatter.ofPattern(DATE_FORMAT_DATETIME));
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern(dateFormat);
return LocalDateTime.parse(localDateTime.format(ofPattern), ofPattern);
}
/**
* 把字符串转成日期类型.
* 输入的日期格式:yyyy-MM-dd
*
* @param str 日期字符串
* @return 转换后的日期
* @throws ParseException 异常
* @see LocalDateTime
*/
public static LocalDateTime parseLocalDateTime10(final String str) throws ParseException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_DATEONLY);
LocalDateTime time = LocalDateTime.from(LocalDate.parse(str, formatter).atStartOfDay());
return time;
}
/**
* 把字符串转成日期类型.
* 输入的日期格式:yyyy-MM-dd
*
* @param str 日期字符串
* @return 转换后的日期
* @throws ParseException 异常
* @see LocalDateTime
*/
public static LocalDate parseLocalDate(final String str) throws ParseException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_DATEONLY);
return LocalDate.parse(str, formatter);
}
/**
* 把字符串转成日期类型.
*
* @param str 日期字符串
* @param format 日期格式
* @return 转换后的日期
* @throws ParseException 异常
* @see LocalDateTime
*/
public static LocalDate parseLocalDate(final String str, final String format) throws ParseException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return LocalDate.parse(str, formatter);
}
/**
* 获得当前的日期毫秒.
*
* @return 当前毫秒数
*/
public static long nowTimeMillis() {
return Clock.systemDefaultZone().millis();
}
/**
* 获取从1970年到现在的秒数.
*
* @return 秒数
*/
public static long nowEpochSecond() {
return Clock.systemDefaultZone().instant().getEpochSecond();
}
/**
* 获得当前的时间戳.
*
* @return 时间点
*/
public static Instant nowTimestamp() {
return Instant.now(Clock.systemDefaultZone());
}
/**
* yyyy-MM-dd 当前日期.
*
* @return 当前日期 yyyy-MM-dd
*/
public static String getCurrentDate() {
return LocalDate.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT_DATEONLY));
}
/**
* 获取当前日期时间 yyyy-MM-dd HH:mm:ss.
*
* @return 获取当前日期时间 yyyy-MM-dd HH:mm:ss
*/
public static String getCurrentDateTime() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT_DATETIME));
}
/**
* 获取当前日期时间.
*
* @param format 格式字符串
* @return 获取当前日期时间
*/
public static String getCurrentDateTime(final String format) {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
}
/**
* 获取当前时间 HH:mm:ss.
*
* @return 获取当前时间 HH:mm:ss
*/
public static String getCurrentTime() {
return LocalTime.now().format(DateTimeFormatter.ofPattern(HMS_FORMAT));
}
/**
* yyyy-MM-dd 格式化传入日期.
*
* @param date 日期
* @return yyyy-MM-dd 日期
*/
public static String formaterDate(final LocalDate date) {
return date.format(DateTimeFormatter.ofPattern(DATE_FORMAT_DATEONLY));
}
/**
* 将localDateTime 格式化成特定格式的字符串.
*
* @param time 时间
* @param dateFormat 格式化
* @return String
*/
public static String formaterTime(final LocalTime time, final String dateFormat) {
return time.format(DateTimeFormatter.ofPattern(dateFormat));
}
/**
* yyyyMMdd 格式化传入日期.
*
* @param date 传入的日期
* @return yyyyMMdd 字符串
*/
public static String formaterDateToyyyyMMdd(final LocalDate date) {
return date.format(DateTimeFormatter.ofPattern(SHORTDATEFORMAT));
}
/**
* 将localDateTime 格式化成yyyy-MM-dd HH:mm:ss.
*
* @param dateTime 时间
* @return String
*/
public static String formaterLocalDateTime(final LocalDateTime dateTime) {
return dateTime.format(DateTimeFormatter.ofPattern(DATE_FORMAT_DATETIME));
}
/**
* 将localDateTime 格式化成特定格式的字符串.
*
* @param dateTime 时间
* @param dateFormat 格式化
* @return string
*/
public static String formaterLocalDateTime(final LocalDateTime dateTime, final String dateFormat) {
return dateTime.format(DateTimeFormatter.ofPattern(dateFormat));
}
/**
* yyyy-MM-dd HH:mm:ss.
* 时间点转换成日期字符串
*
* @param instant 时间点.
* @return 日期时间 yyyy-MM-dd HH:mm:ss
*