longz
2026-08-05 101e4ff6a848f010aaa451fa1131cdf9b18b6dde
fix: format site export timestamps
2个文件已修改
38 ■■■■■ 已修改文件
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
        }
    }
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