gpt4 book ai didi

java - ZonedDateTime 不显示通过 DateTimeFormatter 预期的时区

转载 作者:行者123 更新时间:2023-12-04 02:27:11 25 4
gpt4 key购买 nike

我有一个时区为 EST 的日期输入.
我将其解析为 ZonedDateTime ,但格式化时显示为 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
我的时区是 GMT。采用OpenJDK 14.0.2.12,en_GB 语言环境。
对于上下文,我试图在 Amazon Corretto 11 的最新版本中更好地理解这个问题 - https://github.com/corretto/corretto-11/issues/147

最佳答案

tl;博士
你说:

it's being displayed as GMT-04:00, rather than EST as I'd expect.


此类细节取决于是否 Locale.UK是否有效。
  • 16/07/2017 19:28:33 GMT-04:00Locale.UK
  • 16/07/2017 19:28:33 EDTLocale.US
  • 16/07/2017 19:28:33 HAELocale.CANADA_FRENCH

  • ➥ 对于文本日期时间数据交换,(a) 坚持使用 ISO 8601标准格式,以及 (b) 在可行时使用零偏移量。这样做没有意义 Issue # 147 .
    细节
    对了,努力去 避免使用 2-4 个字母的伪区域解析日期时间文本 喜欢 EST , EDT , IST , CST .这些是非标准的,非唯一的(!),试图暗示时区以及是否 Daylight Saving Time (DST)有效。
    仅使用 real time zones , 格式为 Continent/RegionEurope/London .

    你说:

    rather than EST as I'd expect


    夏令时 (DST) 在时区的该日期时间生效 America/New_York ,不是 Standard Time .所以你应该期待 EDT而不是 EST .

    我建议您不要通过在您的 println 中嵌入调用来使问题复杂化。声明。
    您应该指定 Locale而不是隐式依赖 JVM 的当前默认语言环境,该语言环境可以在运行时随时更改。所以请注意我如何附加 .withLocale( locale )DateTimeFormatter的形成目的。我指定了 Locale.UK因为你提到了 en_GB在评论中。
    因此,让我们将您的代码修改为:
    final Locale locale = Locale.US ;  // Locale.UK versus Locale.US yield different outputs.
    final String input = "16/07/2017 19:28:33 EST";
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss z" ).withLocale( locale ) ;
    final ZonedDateTime zdt = ZonedDateTime.parse( input , formatter ) ;
    final String zdtToString = zdt.toString() ;
    final String zdtFormatted = zdt.format( formatter ) ;
    … 和:
    // Dump to console.
    System.out.println( "input: " + input ) ;
    System.out.println( "zdt: " + zdt ) ;
    System.out.println( "zdtToString: " + zdtToString ) ;
    System.out.println( "zdtFormatted: " + zdtFormatted ) ;
    code run live at IdeOne.com在 Java 12 上。
    input: 16/07/2017 19:28:33 EST
    zdt: 2017-07-16T19:28:33-04:00[America/New_York]
    zdtToString: 2017-07-16T19:28:33-04:00[America/New_York]
    zdtFormatted: 16/07/2017 19:28:33 GMT-04:00
    如果我们从 Locale.UK 更改该语言环境至 Locale.US ,我们得到了不同的结果。
    zdtFormatted: 16/07/2017 19:28:33 EDT

    关于java - ZonedDateTime 不显示通过 DateTimeFormatter 预期的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66737110/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com