【问题标题】:DST while using EST time zone in java code [duplicate]在 java 代码中使用 EST 时区时的 DST [重复]
【发布时间】:2017-08-30 06:25:07
【问题描述】:

我有一段用 java 编写的代码,它使用 EST 时区为我提供正确的时间,如下所示:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class DateProgram {

    public static void main(String[] args) {
        TimeZone.setDefault(TimeZone.getTimeZone("EST"));
        String dateTime = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());
        System.out.println(dateTime);

    }
}

在这里我想使用 EST 时区添加夏令时的代码,我的输出应该给我正确的时间考虑到 EST 时区和夏令时。

感谢任何帮助, 提前致谢

【问题讨论】:

  • @ZakiAnwarHamdani 我读了这个问题及其解决方案,它没有回答我在这里提出的问题
  • 考虑时区的夏令时。这就是另一个问题中提出和回答的问题。您的问题与该问题有何不同?
  • 顺便说一句,如果可以,请避免使用早已过时的课程Date 和朋友。你可以。特别是避免TimeZone.setDefault(),它可能不仅会破坏您自己程序的功能,还会破坏在同一JVM中运行的其他程序的功能。我推荐LocalDateTime.now(ZoneId.of("America/New_York")) .format(DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss"))
  • 只是为了强调 Andy Turner 在his answer 中已经说过的话:尽可能避免使用三个和四个字母的时区缩写。它们是模棱两可的,没有标准化的。例如,根据Time Zone Abbreviations – Worldwide List EST 也可能表示澳大利亚东部标准时间 (UTC+10)。

标签: java date timezone dst


【解决方案1】:

java.time

使用现代 java.time 类来取代麻烦的旧日期时间类。

避免使用 3-4 个字母的代码,例如 EST。这些不是实际的时区,不是标准化的,甚至不是唯一的!以continent/region 的形式使用real time zone names

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

ISO 8601

我建议您在生成字符串时考虑使用标准 ISO 8601 格式,而不是您的特殊格式。 java.time 类在生成/解析字符串时默认使用标准格式。

但如果你坚持……

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMdd-HHmmss" ) ;
String output = zdt.format( f ) ;

【讨论】:

    【解决方案2】:

    令人困惑的是,TimeZone.getTimeZone("EST") 不像 PST 那样遵守夏令时。 (HSTMST 也是如此)。

    请改用TimeZone.getTimeZone("America/New_York")

    一般情况下,请避免使用三字母时区缩写,如 Javadoc 中所述。

    【讨论】:

    • 正确的想法,但使用麻烦的旧日期时间类,这些类现在已经遗留,被 java.time 类所取代。
    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2012-02-22
    相关资源
    最近更新 更多