package com.ruoyi.system.wxPay.utils; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.springframework.util.StringUtils; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Objects; import java.util.TimeZone; /** * @author xiaochen * @ClassName WxTimeUtils * @Description * @date 2021-12-16 16:07 */ public class WxTimeUtils { /** * 系统默认时区 */ private static final ZoneId ZONE = ZoneId.systemDefault(); /** * yyyy-MM-dd'T'HH:mm:ssxxx 比如:2020-05-23T17:06:30+08:00 0时区时末尾 为+00:00 */ public static final DateTimeFormatter YYYY_MM_DD_T_HH_MM_SS_XXX_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx"); /** * yyyy-MM-dd HH:mm:ss 比如:2020-05-23 17:06:30 */ public static final DateTimeFormatter YYYY_MM_DD_HH_MM_SS_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZONE); /** * 时间转 TimeZone * * @param date * @return * @throws Exception */ public static String dateToTimeZone(Date date) throws Exception { String time; if (date == null) { throw new Exception("date is not null"); } ZonedDateTime zonedDateTime = toZonedDateTime(date); time = format(zonedDateTime, YYYY_MM_DD_T_HH_MM_SS_XXX_FMT); return time; } /** * Date转ZonedDateTime,时区为系统默认时区 * * @param date Date * @return ZonedDateTime */ public static ZonedDateTime toZonedDateTime(Date date) { Objects.requireNonNull(date, "date"); return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()); } /** * 根据 formatter格式化 zonedDateTime * * @param zonedDateTime ZonedDateTime * @param formatter DateTimeFormatter * @return String */ public static String format(ZonedDateTime zonedDateTime, DateTimeFormatter formatter) { Objects.requireNonNull(zonedDateTime, "zonedDateTime"); Objects.requireNonNull(formatter, "formatter"); return zonedDateTime.format(formatter); } /** * TimeZone 时间转标准时间 * * @param date * @return * @throws Exception */ public static String toTimeZoneStr(String date) { String time; if (!StringUtils.hasLength(date)) { throw new RuntimeException("str is not null"); } ZonedDateTime zonedDateTime = parseToZonedDateTime(date, YYYY_MM_DD_T_HH_MM_SS_XXX_FMT); if (zonedDateTime == null) { throw new RuntimeException("str to zonedDateTime fail"); } time = zonedDateTime.format(YYYY_MM_DD_HH_MM_SS_FMT); return time; } /** * 转date * * @param date * @return * @throws Exception */ public static Date toDate(String date) { String time; if (!StringUtils.hasLength(date)) { throw new RuntimeException("str is not null"); } ZonedDateTime zonedDateTime = parseToZonedDateTime(date, YYYY_MM_DD_T_HH_MM_SS_XXX_FMT); if (zonedDateTime == null) { throw new RuntimeException("str to zonedDateTime fail"); } return Date.from(zonedDateTime.toInstant()); } /** * str --> Date * * @param date * @return java.util.Date * @author xiaochen * @date 2022-01-20 18:20 */ public static Date toRfc3339Date(String date) { DateTime dt2 = new DateTime(date); return dt2.toDate(); } /** * 将 Date 转为 LocalDateTime * * @param date * @return java.time.LocalDateTime; */ public static LocalDateTime dateToLocalDateTime(Date date) { return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); } /** * str --> Date * * @param date * @return java.util.Date * @author xiaochen * @date 2022-01-20 18:20 */ public static String toRfc3339Str(Date date) { DateTime dt1 = new DateTime(new Date(), DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))); return dt1.toString(); } /** * 根据 formatter解析为 ZonedDateTime * * @param text 待解析字符串 * @param formatter DateTimeFormatter * @return ZonedDateTime */ public static ZonedDateTime parseToZonedDateTime(String text, DateTimeFormatter formatter) { return ZonedDateTime.parse(text, formatter); } }