首页 > 解决方案 > Java String DateTime 到 toEpochMilli - 不同的区域

问题描述

我正在为 toEpochMilli() 开发一个字符串转换方法。但是当我在不同的时区区域服务器上发布代码时,我得到了不同的结果。怎么解决 ?

    //input = "2019-12-26T00:00:00"

    private static Long converter(String stringDate) {
        try {
            LocalDateTime dateTime = LocalDateTime.parse(stringDate, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
            ZoneId zoneId = ZoneId.of("America/Sao_Paulo");
            return dateTime.atZone(zoneId).toInstant().toEpochMilli();
        } catch (DateTimeParseException dte) {
            throw new DateException("Invalid input format", dte);
        }
    }

Sao Paulo 输出转换为 LocalDateTime,得到与输入相同的结果,但北弗吉尼亚输出转换为 LocalDateTime,从输入获得不同结果。

public static String backConverter(Long epochMilli) {
    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.of("America/Sao_Paulo"));
    return DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").format(localDateTime);
}

标签: javatimezoneepochregiondatetime-conversion

解决方案


该解决方案适用于具有相同输出的不同地方。

//input = "2019-12-26T00:00:00"

private static Long converter(String stringDate) {
    try {
        LocalDateTime dateTime = LocalDateTime.parse(stringDate, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
        ZoneId zoneId = ZoneId.systemDefault();
        return dateTime.atZone(zoneId).toInstant().toEpochMilli();
    } catch (DateTimeParseException dte) {
        throw new DateException("Invalid input format", dte);
    }
}

public static String backConverter(Long epochMilli) {
    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli), ZoneId.systemDefault());
    return DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").format(localDateTime);
}

推荐阅读