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.
我正在尝试将我的时间戳从 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.