Java ZonedDateTime未通过DateTimeFormatter显示预期时区
我有一个时区为Java ZonedDateTime未通过DateTimeFormatter显示预期时区,java,date,java-time,zoneddatetime,Java,Date,Java Time,Zoneddatetime,我有一个时区为EST的日期输入 我正在将它解析为一个zoneDateTime,但在格式化时,它显示为GMT-04:00,而不是我所期望的EST 为什么会发生这种情况?我能让它显示我期望的时区吗 范例 final String dateString = "16/07/2017 19:28:33 EST"; final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:
EST
的日期输入
我正在将它解析为一个zoneDateTime
,但在格式化时,它显示为GMT-04:00
,而不是我所期望的EST
为什么会发生这种情况?我能让它显示我期望的时区吗
范例
final String dateString = "16/07/2017 19:28:33 EST";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss z");
System.out.println(MessageFormat.format("Input - {0}", dateString));
System.out.println(MessageFormat.format("Parsed - {0}", formatter.format(ZonedDateTime.parse(dateString, formatter))));
输出:
Input - 16/07/2017 19:28:33 EST
Parsed - 16/07/2017 19:28:33 GMT-04:00
我的时区是格林尼治标准时间。采用OpenJDK 14.0.2.12,英语国家语言环境
在上下文中,我试图在Amazon Corretto 11-tl的最新版本中更好地理解这个问题;博士
你说:
它显示为GMT-04:00,而不是我预期的东部时间
这些细节取决于Locale.UK
是否有效
⇐ <代码>Locale.UK16/07/2017 19:28:33 GMT-04:00
⇐ <代码>区域设置。美国16/07/2017 19:28:33美国东部夏令时
⇐ <代码>地区。加拿大\法语16/07/2017 19:28:33 HAE
EST
,EDT
,IST
,CST
。这些都是非标准的、非唯一的(!),在暗示时区以及是否有效方面的尝试很弱
仅限使用,格式为大陆/地区
,如欧洲/伦敦
你说: 而不是像我预料的那样 夏令时(DST)在美国/纽约时区的日期时间生效,而不是。因此,您应该期待的是
EDT
,而不是EST
我建议您不要在
println
语句中嵌入调用,从而使事情复杂化
您应该指定语言环境
,而不是隐式地依赖JVM的当前默认语言环境,该语言环境在运行时随时都可能更改。因此,请注意我是如何将.withLocale(locale)
附加到DateTimeFormatter
对象的构成中的。我指定了Locale.UK
,因为您在评论中提到了en_GB
因此,让我们将您的代码修改为:
final Locale=Locale.US;//Locale.UK与Locale.US产生不同的输出。
最终字符串输入=“16/07/2017 19:28:33 EST”;
final DateTimeFormatter formatter=DateTimeFormatter.of模式(“dd/MM/yyyy HH:MM:ss z”)。带有区域设置(区域设置);
final ZonedDateTime zdt=ZonedDateTime.parse(输入,格式化程序);
最终字符串zdtotstring=zdt.toString();
最终字符串zdtFormatted=zdt.format(格式化程序);
……和:
//转储到控制台。
System.out.println(“输入:”+输入);
System.out.println(“zdt:+zdt”);
System.out.println(“ZDTOString:+ZDTOString”);
System.out.println(“zdtFormatted:+zdtFormatted”);
请参阅关于Java12的文章
输入:美国东部时间2017年7月16日19:28:33
zdt:2017-07-16T19:28:33-04:00[美国/纽约]
ZdtotString:2017-07-16T19:28:33-04:00[美国/纽约]
zdtFormatted:16/07/2017 19:28:33 GMT-04:00
如果我们将区域设置从locale.UK
更改为locale.US
,我们会得到不同的结果
zdtFormatted:16/07/2017 19:28:33美国东部夏令时
tl;博士
切勿使用没有区域设置的日期时间分析器/格式化程序类型(类)
import java.text.MessageFormat;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
class Main {
public static void main(String[] args) {
final String dateString = "16/07/2017 19:28:33 EST";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss z", Locale.ENGLISH);
System.out.println(MessageFormat.format("Input - {0}", dateString));
System.out.println(
MessageFormat.format("Parsed - {0}", formatter.format(ZonedDateTime.parse(dateString, formatter))));
}
}
输出:
Input - 16/07/2017 19:28:33 EST
Parsed - 16/07/2017 19:28:33 EDT
我想你可以将.withZone(ZoneId.of(“EST”))
添加到DateTimeFormatter.of模式(…)
GMT-4是你当前所在的时区吗?@daniu否-我在GMT。@Savior采用OpenJDK 14.0.2.12,en_GB语言环境。我使用locale.UK
进行了复制。有趣。它解析为2017-07-16T19:28:33-04:00[美国/纽约]
,这并不奇怪,但随后格式为16/07/2017 19:28:33 GMT-04:00
,坦率地说,这对我来说是正确的。你的回答让我意识到问题中显示的输入实际上是不正确的,是EST
,而不是EDT
。