Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ZonedDateTime未通过DateTimeFormatter显示预期时区_Java_Date_Java Time_Zoneddatetime - Fatal编程技术网

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
是否有效

  • 16/07/2017 19:28:33 GMT-04:00
    ⇐ <代码>Locale.UK
  • 16/07/2017 19:28:33美国东部夏令时
    ⇐ <代码>区域设置。美国
  • 16/07/2017 19:28:33 HAE
    ⇐ <代码>地区。加拿大\法语
➥ 对于文本日期时间数据交换,(a)坚持标准格式,(b)只要可行,就使用零偏移量。这样做毫无意义

细节 顺便说一下,尽量避免使用2-4个字母的伪区域来解析日期时间文本,比如
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