关于日期:Java SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss’Z’”)给出时区为IST

Java SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss'Z'”) gives timezone as IST

我将simpledateformat构造函数设置为

1
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

我正在分析字符串"2013-09-29T18:46:19Z".

我读过,这里z代表GMT/UTC时区。但当我在控制台上打印这个日期时,它会为返回的日期打印istTimezne。

现在我的问题是我的输出是对还是错?


您没有设置时区,只是在日期/时间的末尾添加了一个Z,所以它看起来像是一个GMT日期/时间,但这不会改变值。

将时区设置为格林尼治标准时间,它将是正确的。

1
2
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));


这里把'T''Z'看作常量。你需要在没有报价的情况下通过Z。此外,还需要在输入字符串中指定时区。

示例:2013-09-29T18:46:19-0700格式为"yyyy-MM-dd'T'HH:mm:ssZ"


从ISO 8601字符串到Java日期对象

1
2
3
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

如果不设置TimeZone.getTimeZone("GMT"),则输出Sun Sep 29 18:46:19 CST 2013

从Java日期对象到ISO 8601字符串

并使用以下代码将Date对象转换为iso 8601标准(yyyy-MM-dd'T'HH:mm:ss'Z')

1
2
3
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));          
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

还请注意,在z yyyy-MM-dd'T'HH:mm:ssZ处没有' '打印2015-01-22T03:41:02+0000


如果您想处理日期的"标准"JSON表示,那么最好使用这个模式:"yyyy-MM-dd'T'HH:mm:ssX"

注意末尾的X。它将处理iso 8601标准中的时区,而iso8601正是在javascript new Date().toJSON()中生成此语句的工具。

与其他答案相比,它有一些好处:

  • 您不需要要求您的客户以格林威治标准时间发送日期。
  • 您不需要使用以下命令将日期对象显式转换为格林尼治标准时间:sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

  • 如果你没有选择使用Java8,最好使用'yyyy-mm-dd't'hh:mm:ssxxx'因为这会再次得到正确的解析(而只有一个x,情况可能不是这样……取决于您的解析函数)

    X生成:+01

    XXX生成:+01:00


    DR

    其他的答案是过时的,如Java 8。

    1
    2
    3
    4
    5
    Instant                           // Represent a moment in UTC.
    .parse("2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces"Zulu".
    .atZone(                          // Adjust from UTC to a time zone.
        ZoneId.of("Asia/Kolkata" )
    )                                 // Returns a `ZonedDateTime` object.

    。ISO 8601标准

    您的字符串格式正好符合ISO 8601标准。本标准定义了将各种日期时间值表示为文本的合理格式。

    java.time时间

    旧的EDCOX1、EDCX1、18、EDCX1、19个类已经被Java.TimeFramework构建成Java 8和更高版本。请参见教程。避免使用旧的类,因为它们被证明是设计糟糕、混乱和麻烦的。

    旧类中糟糕的设计有一部分让您感到苦恼,在生成日期时间值的文本表示形式时,toString方法应用了JVM的当前默认时区,该日期时间值实际上是以UTC(GMT)表示的;用意很好,但令人困惑。

    在分析/生成日期时间值的文本表示形式时,java.time类默认使用iso 8601格式。所以不需要指定解析模式。

    Instant是UTC时间线上的一个时刻。

    1
    Instant instant = Instant.parse("2013-09-29T18:46:19Z" );

    您可以根据需要应用时区来生成ZonedDateTime对象。

    1
    2
    ZoneId zoneId = ZoneId.of("America/Montreal" );
    ZonedDateTime zdt = instant.atZone( zoneId );