From 101e4ff6a848f010aaa451fa1131cdf9b18b6dde Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 05 八月 2026 21:07:13 +0800
Subject: [PATCH] fix: format site export timestamps

---
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java     |   29 ++++++++++++++++++++---------
 ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java |    9 +++++----
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java
index 04e1064..3de4237 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java
@@ -8,6 +8,7 @@
 import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -109,7 +110,7 @@
     private BigDecimal ratedPower;
     @Excel(name = "*是否峰谷分时", width = 20, readConverterExp = "0=否,1=是")
     private Integer periodFee;
-    @Excel(name = "*正式投运时间", width = 22, prompt = "格式:yyyy-MM-dd")
+    @Excel(name = "*正式投运时间", width = 22, prompt = "格式:yyyy-MM-dd HH:mm:ss")
     private String officialRunTime;
     @Excel(name = "充换电站方位", width = 24, readConverterExp = "1=地面-停车场,2=地面-路侧,3=地下停车,4=立体式停车楼")
     private Integer stationOrientation;
@@ -161,20 +162,30 @@
             return value;
         }
         String text = value.trim();
-        try {
-            return LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE).toString();
-        } catch (DateTimeParseException ignored) {
-            // Continue with timestamp formats used by historical site data.
-        }
+        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         try {
             return OffsetDateTime.parse(text, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
-                    .atZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalDate().toString();
+                    .atZoneSameInstant(ZoneId.of("Asia/Shanghai"))
+                    .format(outputFormatter);
         } catch (DateTimeParseException ignored) {
-            // Some records use an instant with millisecond precision and a trailing Z.
+            // Continue with timestamps without an explicit offset.
         }
         try {
-            return Instant.parse(text).atZone(ZoneId.of("Asia/Shanghai")).toLocalDate().toString();
+            return Instant.parse(text).atZone(ZoneId.of("Asia/Shanghai")).format(outputFormatter);
         } catch (DateTimeParseException ignored) {
+            // Continue with local datetime formats used by historical site data.
+        }
+        try {
+            return LocalDateTime.parse(text, DateTimeFormatter.ISO_LOCAL_DATE_TIME).format(outputFormatter);
+        } catch (DateTimeParseException ignored) {
+            // Continue with date-only values.
+        }
+        try {
+            return LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE)
+                    .atStartOfDay()
+                    .format(outputFormatter);
+        } catch (DateTimeParseException ignored) {
+            // Preserve an unrecognized value rather than dropping it.
             return text;
         }
     }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java b/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java
index e9d01dc..08ebd43 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java
@@ -14,10 +14,11 @@
 class SiteExcelDTOTest {
 
     @Test
-    void formatsOfficialRunTimeAsLocalDate() {
-        assertEquals("2024-12-31", SiteExcelDTO.formatDateOnly("2024-12-30T16:00:00.000Z"));
-        assertEquals("2025-05-31", SiteExcelDTO.formatDateOnly("2025-05-30T16:02:14.900Z"));
-        assertEquals("2026-07-21", SiteExcelDTO.formatDateOnly("2026-07-21"));
+    void formatsOfficialRunTimeAsLocalDateTime() {
+        assertEquals("2024-12-31 00:00:00", SiteExcelDTO.formatDateOnly("2024-12-30T16:00:00.000Z"));
+        assertEquals("2025-05-31 00:02:14", SiteExcelDTO.formatDateOnly("2025-05-30T16:02:14.900Z"));
+        assertEquals("2026-07-21 00:00:00", SiteExcelDTO.formatDateOnly("2026-07-21"));
+        assertEquals("2026-07-21 08:09:10", SiteExcelDTO.formatDateOnly("2026-07-21T08:09:10"));
     }
 
     @Test

--
Gitblit v1.7.1