首页 > 解决方案 > 具有时区问题的 ISO 日期时间

问题描述

我只是按照以下文档 http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169814.htm打印带有时区的 ISO 日期时间

这是我的代码

TimeZone tz = TimeZone.getTimeZone("UTC");
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.nnnnnn+|-hh:mm"); 
        df.setTimeZone(tz);
        dateTimeWithTimeZone = df.format(new Date());

但是我得到这个异常
非法模式字符'n'我不能直接在Java中使用这种格式?

标签: datetimejava-8

解决方案


java.time

    dateTimeWithTimeZone = Instant.now().toString();
    System.out.println(dateTimeWithTimeZone);

当我刚才运行这个片段时,我得到了这个输出:

2019-03-18T22:28:13.549319Z

您链接到的页面尚不清楚,但它是 UTC 的 ISO 8601 字符串,所以应该是您所需要的。我正在利用 java.time 类从它们的toString方法产生 ISO 8601 输出这一事实。链接的页面确实显示了带有连字符T和冒号 ( 2008-09-15T15:53:00+05:00) 的格式,它显示了另一个在秒 ( 15:53:00.322348) 上带有小数的示例和第三个Z表示 UTC ( 20080915T155300Z) 的示例,所以我希望这三个的组合将是也可以。

您在问题中使用的格式似乎试图将偏移量作为+00:00而不是Z. 如果这是一个要求,它只是稍微复杂一点。我们使用显式格式化程序来控制 ISO 8601 中的变化:

        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);

2019-03-18T22:28:13.729711+00:00

你的代码出了什么问题?

您尝试将源中的格式符号与SimpleDateFormat. 首先,您永远不应该,尤其是在 Java 8 或更高版本中,想要使用SimpleDateFormat. 这个类是出了名的麻烦和过时。其次,它的一些格式模式字母与您来源的符号一致,其中一些不符合,因此您不能只使用那里的 symvol 字符串。相反,您需要阅读文档并找到正确的格式模式字母以用于年、月等。并注意它们区分大小写:MM并且mm是不同的。

关联

Oracle 教程: 解释如何使用 java.time 的日期时间。


推荐阅读