DateTimeUtil.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.usky.rule.util;
  2. import com.usky.rule.constant.DateTimeConstants;
  3. import com.usky.rule.constant.RegExpConstants;
  4. import feign.Util;
  5. import java.sql.Timestamp;
  6. import java.time.Instant;
  7. import java.time.LocalDateTime;
  8. import java.time.ZoneId;
  9. import java.time.ZoneOffset;
  10. import java.time.format.DateTimeFormatter;
  11. import java.util.Date;
  12. public class DateTimeUtil {
  13. private DateTimeUtil() {
  14. }
  15. public static LocalDateTime dateToLocalDateTime(Date date) {
  16. return date != null ? LocalDateTime.ofInstant(date.toInstant(), getZoneId()) : null;
  17. }
  18. public static Date localDateTimeToDate(LocalDateTime dateTime) {
  19. return dateTime != null ? Date.from(dateTime.atZone(getZoneId()).toInstant()) : null;
  20. }
  21. public static LocalDateTime timestampToLocalDateTime(Timestamp timestamp) {
  22. return timestamp != null ? LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp.getTime()), getZoneId()) : null;
  23. }
  24. public static String format(LocalDateTime dateTime) {
  25. return dateTime != null ? dateTime.format(DateTimeConstants.DATE_TIME_FORMATTER) : null;
  26. }
  27. public static String format(LocalDateTime dateTime, DateTimeFormatter formatter) {
  28. return dateTime != null ? dateTime.format(formatter) : null;
  29. }
  30. public static LocalDateTime parse(String dateTime) {
  31. return parse(dateTime, DateTimeConstants.DATE_TIME_FORMATTER);
  32. }
  33. public static LocalDateTime parse(String dateTime, DateTimeFormatter formatter) {
  34. return Util.isNotBlank(dateTime) ? LocalDateTime.parse(dateTime, formatter) : null;
  35. }
  36. /**
  37. * 将 Unix 时间戳转为东八区 {@link LocalDateTime}。
  38. * 小于 1e12 的数值按「秒」理解,否则按「毫秒」(兼容 10 位秒级与 13 位毫秒级)。
  39. */
  40. public static LocalDateTime fromEpochMillisOrSeconds(long epoch) {
  41. long millis = epoch < 1_000_000_000_000L ? epoch * 1000L : epoch;
  42. return LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), getZoneId());
  43. }
  44. /**
  45. * 解析 MQ/设备上报中的时间字段:支持 Number 或纯数字字符串(秒/毫秒时间戳),
  46. * 也兼容原有 {@link DateTimeConstants#SIMPLE_DATE_TIME_FORMATTER}、{@link DateTimeConstants#DATE_TIME_FORMATTER} 字符串。
  47. */
  48. public static LocalDateTime parseMessageTimestamp(Object raw) {
  49. if (raw == null) {
  50. return null;
  51. }
  52. if (raw instanceof Number) {
  53. return fromEpochMillisOrSeconds(((Number) raw).longValue());
  54. }
  55. String s = raw.toString().trim();
  56. if (!Util.isNotBlank(s)) {
  57. return null;
  58. }
  59. if (s.chars().allMatch(Character::isDigit)) {
  60. if (s.length() == 14 && RegExpConstants.SIMPLE_DATE_TIME_PATTERN.matcher(s).matches()) {
  61. return parse(s, DateTimeConstants.SIMPLE_DATE_TIME_FORMATTER);
  62. }
  63. return fromEpochMillisOrSeconds(Long.parseLong(s));
  64. }
  65. return parse(s, DateTimeConstants.DATE_TIME_FORMATTER);
  66. }
  67. public static long toEpochMilli(LocalDateTime dateTime) {
  68. if (dateTime == null) {
  69. throw new IllegalArgumentException("dateTime is null");
  70. } else {
  71. return dateTime.atZone(getZoneId()).toInstant().toEpochMilli();
  72. }
  73. }
  74. public static ZoneId getZoneId() {
  75. return ZoneOffset.of("+8");
  76. }
  77. public static boolean isValidDateTime(String dateTime) {
  78. int dataTimeStringLength = 14;
  79. return dateTime.length() != 14 ? false : RegExpConstants.SIMPLE_DATE_TIME_PATTERN.matcher(dateTime).matches();
  80. }
  81. public static String secondToTime(Long second) {
  82. if (second != null && second != 0L) {
  83. long days = second / 86400L;
  84. second = second % 86400L;
  85. long hours = second / 3600L;
  86. second = second % 3600L;
  87. long minutes = second / 60L;
  88. second = second % 60L;
  89. return days > 0L ? String.format("%d天%d小时%d分%d秒", days, hours, minutes, second) : String.format("%d小时%d分%d秒", hours, minutes, second);
  90. } else {
  91. return "";
  92. }
  93. }
  94. }