|
|
@@ -0,0 +1,131 @@
|
|
|
+package com.management.platform.util;
|
|
|
+
|
|
|
+import java.time.*;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.format.DateTimeParseException;
|
|
|
+import java.util.Optional;
|
|
|
+
|
|
|
+public class TimeZoneConverter {
|
|
|
+
|
|
|
+ private static final DateTimeFormatter INPUT_FORMATTER =
|
|
|
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ private static final DateTimeFormatter OUTPUT_FORMATTER =
|
|
|
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ private static final ZoneId TARGET_ZONE = ZoneId.of("Asia/Shanghai"); // 或者 "UTC+8"
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将任意时区的时间转换为东八区时间
|
|
|
+ *
|
|
|
+ * @param dateTimeStr 时间字符串,格式:yyyy-MM-dd HH:mm:ss
|
|
|
+ * @param timeZone 时区字符串,可能的值:
|
|
|
+ * - null 或空字符串:表示UTC时区
|
|
|
+ * - "UTC":UTC时区
|
|
|
+ * - "Asia/Shanghai":上海时区
|
|
|
+ * - "America/New_York":纽约时区
|
|
|
+ * - 其他合法的时区ID
|
|
|
+ * @return 东八区时间字符串,格式:yyyy-MM-dd HH:mm:ss
|
|
|
+ * @throws IllegalArgumentException 如果时间格式或时区无效
|
|
|
+ */
|
|
|
+ public static String convertToEast8(String dateTimeStr, String timeZone) {
|
|
|
+ // 参数验证
|
|
|
+ validateInput(dateTimeStr);
|
|
|
+ try {
|
|
|
+ // 解析本地时间
|
|
|
+ LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr.trim(), INPUT_FORMATTER);
|
|
|
+
|
|
|
+ // 获取源时区
|
|
|
+ ZoneId sourceZoneId = parseTimeZone(timeZone);
|
|
|
+
|
|
|
+ // 创建带时区的时间
|
|
|
+ ZonedDateTime sourceZonedDateTime = localDateTime.atZone(sourceZoneId);
|
|
|
+
|
|
|
+ // 转换到目标时区(东八区)
|
|
|
+ ZonedDateTime targetZonedDateTime = sourceZonedDateTime.withZoneSameInstant(TARGET_ZONE);
|
|
|
+
|
|
|
+ // 格式化输出
|
|
|
+ return targetZonedDateTime.format(OUTPUT_FORMATTER);
|
|
|
+
|
|
|
+ } catch (DateTimeParseException e) {
|
|
|
+ throw new IllegalArgumentException("时间格式错误,必须为: yyyy-MM-dd HH:mm:ss", e);
|
|
|
+ } catch (DateTimeException e) {
|
|
|
+ throw new IllegalArgumentException("时区格式错误: " + timeZone, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析时区字符串
|
|
|
+ */
|
|
|
+ private static ZoneId parseTimeZone(String timeZone) {
|
|
|
+ if (timeZone == null || timeZone.trim().isEmpty()) {
|
|
|
+ return ZoneOffset.UTC; // 空字符串表示0时区
|
|
|
+ }
|
|
|
+
|
|
|
+ String tz = timeZone.trim();
|
|
|
+
|
|
|
+ // 处理一些常见别名
|
|
|
+ if (tz.equalsIgnoreCase("Z") ||
|
|
|
+ tz.equalsIgnoreCase("UTC") ||
|
|
|
+ tz.equalsIgnoreCase("GMT")) {
|
|
|
+ return ZoneOffset.UTC;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理时区偏移量格式,如 +08:00, -05:00 等
|
|
|
+ if (tz.matches("^[+-]\\d{1,2}(:\\d{2})?$")) {
|
|
|
+ // 标准化偏移量格式
|
|
|
+ if (!tz.contains(":")) {
|
|
|
+ tz = tz + ":00";
|
|
|
+ }
|
|
|
+ return ZoneId.of(tz);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用标准时区ID
|
|
|
+ return ZoneId.of(tz);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 输入验证
|
|
|
+ */
|
|
|
+ private static void validateInput(String dateTimeStr) {
|
|
|
+ if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
|
|
|
+ throw new IllegalArgumentException("时间字符串不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 简单格式验证
|
|
|
+ if (!dateTimeStr.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
|
|
|
+ throw new IllegalArgumentException("时间格式必须为: yyyy-MM-dd HH:mm:ss");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取带有时区信息的时间字符串
|
|
|
+ */
|
|
|
+ public static String convertWithTimeZoneInfo(String dateTimeStr, String timeZone) {
|
|
|
+ String result = convertToEast8(dateTimeStr, timeZone);
|
|
|
+ return String.format("%s (东八区)", result);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 测试示例
|
|
|
+ public static void main(String[] args) {
|
|
|
+ System.out.println("=== 时间转换示例 ===");
|
|
|
+
|
|
|
+ // 示例1: 空时区(UTC 0时区)
|
|
|
+// System.out.println(convertToEast8("2025-12-12 12:12:12", ""));
|
|
|
+// // 输出: 2025-12-12 20:12:12
|
|
|
+//
|
|
|
+// // 示例2: 纽约时间转东八区
|
|
|
+// System.out.println(convertToEast8("2025-12-12 12:12:12", "America/New_York"));
|
|
|
+ // 输出: 2025-12-13 01:12:12 (纽约比东八区晚13小时)
|
|
|
+
|
|
|
+ // 示例3: 上海时间转东八区(不变)
|
|
|
+ System.out.println(convertToEast8("2025-12-12 12:12:12", "Asia/Shanghai"));
|
|
|
+ // 输出: 2025-12-12 12:12:12
|
|
|
+
|
|
|
+ // 示例4: 使用偏移量
|
|
|
+// System.out.println(convertToEast8("2025-12-12 12:12:12", "+09:00"));
|
|
|
+// // 输出: 2025-12-12 11:12:12
|
|
|
+//
|
|
|
+// // 示例5: 带详细信息
|
|
|
+// System.out.println(convertWithTimeZoneInfo("2025-12-12 12:12:12", ""));
|
|
|
+ // 输出: 2025-12-12 20:12:12 (东八区)
|
|
|
+ }
|
|
|
+}
|