1

请参阅以下测试代码(java 11):

public static final String DATE_FORMAT_TIMESTAMP = "YYYY-MM-dd'T'HH:mm:ss'Z'";
...
var timestamp = OffsetDateTime.now();
System.out.println(timestamp);

var formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_TIMESTAMP);
var zt = timestamp.format(formatter);
System.out.println(zt);
...

输出:enter code here

2020-12-27T23:34:34.886272600+02:00
2021-12-27T23:34:34Z

注意格式化的时间年份是2021。它只发生在 27/12,可能到 31/12。

谁可以给我解释一下这个?以及如何修复代码以获得正确的格式化字符串?

4

2 回答 2

4

你的模式有两个问题:

  1. 使用 ofY而不是y:字母Y指定week-based-yeary指定year-of-era。但是,我建议您使用Java 中的 `DateTimeFormatter` 格式化模式代码中的 `uuuu` 与 `yyyy` 中提到的原因u而不是?. 您还想查看这个关于.yweek-based-year
  2. Z单引号括起来:这是一个错误。这封信Z 指定zone-offset,如果你用单引号括起来,它只是表示文字,Z

查看DateTimeFormatter 的文档页面以了解有关这些内容的更多信息。

快速演示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        final String DATE_FORMAT_TIMESTAMP = "uuuu-MM-dd'T'HH:mm:ssZ";
        // OffsetDateTime now with the default timezone of the JVM
        var timestamp = OffsetDateTime.now();
        System.out.println(timestamp);

        var formatter = DateTimeFormatter.ofPattern(DATE_FORMAT_TIMESTAMP);
        var zt = timestamp.format(formatter);
        System.out.println(zt);

        // OffsetDateTime now with the timezone offset of +02:00 hours
        timestamp = OffsetDateTime.now(ZoneOffset.of("+02:00"));
        System.out.println(timestamp);
        zt = timestamp.format(formatter);
        System.out.println(zt);

        // Parsing a user-provided date-time
        String strDateTime = "2020-12-27T23:34:34.886272600+02:00";
        timestamp = OffsetDateTime.parse(strDateTime);
        System.out.println(timestamp);
        zt = timestamp.format(formatter);
        System.out.println(zt);
    }
}

输出:

2020-12-27T23:44:35.531145Z
2020-12-27T23:44:35+0000
2020-12-28T01:44:35.541700+02:00
2020-12-28T01:44:35+0200
2020-12-27T23:34:34.886272600+02:00
2020-12-27T23:34:34+0200
于 2020-12-27T23:25:16.187 回答
3

那是因为大写YYYY。你需要yyyy在这里。

Y表示周年。那是周数所属的年份。例如,2020 年 12 月 27 日是 2021 年的第 1 周。

于 2020-12-27T21:46:58.860 回答