从格林尼治标准时间(CMT)到时区CEST

时间:2018-07-17 10:20:15

标签: java date datetime timezone gmt

我必须以这种格式输入日期时间:

"2018-07-17T12:16:50.52Z"

因此,我正在使用:

private static final SimpleDateFormat LIVETRACK_DATE_TIME_FORMATTER =
  new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

DATE_TIME_FORMATTER.parse(timeFrameFrom);

但是运行测试用例时出现以下错误:

Tue Jul 17 1[2:20:50 CES]T 2018> but was:<Tue Jul 17 1[0:20:50 GM]T 2018>

这是否意味着我应该将日期转换为GMT格式? 如何转换?

4 个答案:

答案 0 :(得分:1)

如果您使用的是Java8,则可以使用java.time API,在其中可以使用Instant的默认日期时间格式来解析String:

ZonedDateTime zdt = Instant.parse("2018-07-17T12:16:50.52Z")
        .atZone(ZoneId.of("Europe/Berlin"));

输出

2018-07-17T14:16:50.520+02:00[Europe/Berlin]

答案 1 :(得分:1)

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            "EEE MMM dd HH:mm:ss zzz yyyy 'Uhr'", Locale.ROOT);

    String input = "2018-07-17T12:16:50.52Z";
    ZonedDateTime dateTime = Instant.parse(input)
            .atZone(ZoneId.of("Europe/Berlin"));
    String output = dateTime.format(formatter);
    System.out.println(output);

输出:

  

2018年7月17日星期二CEST Uhr

您的测试用例期望错误的结果。输入字符串中的Z表示UTC(从UTC偏移零或所谓的Zulu时区)。 UTC的时间12:16:50.52与中欧夏令时(CEST)的14:16:50.52相同。因此,要求Tue Jul 17 12:20:50 CEST 2018 Uhr是错误的。

在您的代码中,您将Z硬编码为文字,而不是按照需要将其解析为偏移量。有趣的是,这产生了单元测试预期的错误时间点,只是不在预期的时区。这 可能与Date.toString有关,使用的是JVM的时区设置,并且测试期望这是CEST,而实际上是GMT。但是您的SimpleDateFormat并未使用GMT解析字符串(可能是CEST),因此您没有给我们足够的信息来解释测试中发生的一切。除非您明确设置其时区,否则SimpleDateFormat将使用相同的JVM设置,在您发布的代码中不会发生这种情况。

链接: Oracle tutorial: Date Time解释了如何使用java.time

答案 2 :(得分:0)

这里是将日历中的日期转换为不同时区的示例。

TimeZone tzLA = TimeZone.getTimeZone("America/Los_Angeles");
    TimeZone tzIN = TimeZone.getTimeZone("Asia/Calcutta");

    Calendar calendar = new GregorianCalendar();

    calendar.setTimeZone(tzLA);

    long timeLA = calendar.getTimeInMillis();

    System.out.println("Time at America in milliseconds = " +timeLA);
    System.out.println("Hour at America = " +calendar.get(Calendar.HOUR_OF_DAY));

    calendar.setTimeZone(tzIN);

    long timeIN = calendar.getTimeInMillis();
    System.out.println("Time at Asia in millis = " + timeIN);
    System.out.println("Hour at Asia = " + calendar.get(Calendar.HOUR_OF_DAY));

这是输出。

Time at America in milliseconds = 1515136660357
Hour at America = 23
Time at Asia in millis = 1515136660357
Hour at Asia = 12

答案 3 :(得分:0)

  

这是否意味着我应该将日期转换为GMT格式?

否,这意味着'Z'不应该像'T'那样用作常量分隔符,而应视为表示日期所在时区的完整字段。 Z表示GMT时区。

您的格式应该确实是

=SUM((MOD(A1:A12,2^$E$1)>=2^($E$1-1))+0)

这将使SimpleDateFormat识别Z指示GMT时区,因此其产生的日期将与GMT时区对齐。将其转换为String并因此转换为德国时区时,它将添加时差并产生预期的结果。

话虽如此,更好的解决方案是从过时的类java.util.Date和SimpleDateFormat继续,并使用Java 8的java.time。* API。参见其他答案以获取灵感。

相关问题