CDT 到 Java 中的 EST 时间转换未格式化

CDT to EST time conversion in Java not formatting

我正在尝试将我的时间戳从 CST 更改为 EST,但奇怪的是它不起作用,我很清楚为什么。

String timestamp = "Wed Jul 07 10:35:10 CDT 2021";
String formattedTimestamp;
SimpleDateFormat sdfGFTime = new SimpleDateFormat("E MMM dd HH:mm:ss zzz yyyy", Locale.US);
TimeZone obj = TimeZone.getTimeZone("America/New_York");
         
Date date = null;
sdfGFTime.setTimeZone(obj);
date = sdfGFTime.parse(timestamp);
formattedTimestamp = sdfGFTime.format(date);
        
System.out.println(formattedTimestamp);

输出:

Wed Jul 07 10:35:10 CDT 2021

预计:

Wed Jul 07 11:35:10 EST 2021

关于我可能做的不正确的事情有什么想法吗?

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。让我们首先定义您的格式化程序:

private static final DateTimeFormatter DTF
        = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);

现在,转换过程如下:

    String timestamp = "Wed Jul 07 10:35:10 CDT 2021";
    ZonedDateTime parsed = ZonedDateTime.parse(timestamp, DTF);
    ZonedDateTime converted
            = parsed.withZoneSameInstant(ZoneId.of("America/New_York"));
    String formattedTimestamp = converted.format(DTF);
    
    System.out.println(formattedTimestamp);

输出结果与您所说的不完全一样,但接近:

Wed Jul 07 11:35:10 EDT 2021

此外,在纽约,他们使用夏令时(夏令时),因此东部时间的时区缩写在一年中的这个时候被指定为 EDT,而不是 EST。

你的代码出了什么问题?

这个有点棘手好吧,但这只是无数 SimpleDateFormat 没有按照我们最初预期的方式行事的例子之一。当您解析字符串时,SimpleDateFormat 将其时区设置为其从字符串中解析的时区。您刚刚在此之前设置了时区,而您的设置只是默认丢失了。因此,您将 Date 格式化回它来自的同一时区。这就是为什么我建议您永远不要使用 SimpleDateFormat.

教程link

Oracle tutorial: Date Time 解释如何使用 java.time.