格式化前几年的 ZonedDateTime

问题描述

我正在尝试将 MM/dd/YY 格式化为 uuuu-MM-dd'T00:00:00Z

我有以下代码

String dateTime = "12/10/20";
DateFormat df = new SimpleDateFormat("MM/dd/yy");
Date date;
date = df.parse(dateTime); // Thu Dec 10 00:00:00 EST 2020
String dateStr = df.format(date); // 12/10/20
MonthDay monthDay = MonthDay.parse(dateStr,DateTimeFormatter.ofPattern("MM/dd/yy")); // --12-10
zoneddatetime newDate = zoneddatetime.Now().with(monthDay); // 2021-12-10T12:34:21.214-05:00[US/Eastern]
String formattedDate = newDate.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T00:00:00Z'"));

问题在于前几年的日期(如本例中)将作为当前年份返回。

如何使用相同的格式但考虑年份?

解决方法

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yy");
    
    String dateTime = "12/10/20";
    LocalDate date = LocalDate.parse(dateTime,formatter);
    OffsetDateTime  newDateTime = date.atStartOfDay().atOffset(ZoneOffset.UTC);
    
    System.out.println(newDateTime);

输出到这里:

2020-12-10T00:00Z

如果您还需要输出 00 秒,请使用第二个格式化程序:

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
    String formattedDateTime = newDateTime.format(outputFormatter);
    System.out.println(formattedDateTime);

2020-12-10T00:00:00Z

注意事项:

  • java.time 是现代 Java 日期和时间 API,可为您提供所需的所有功能。将 Java 1.0 和 1.1 中旧的、麻烦的日期和时间类混合在一起,充其量只是一种过度复杂化。
  • A MonthDay,顾名思义,是月份和月份的日期,因此不包括年份,这就是您丢失它的地方。相反,我使用 LocalDate
  • ZonedDateTime.now() 为您提供您自己时区的当前日期和时间,当您想要以 UTC 格式显示结果时,这不是您所需要的。相反,date.atStartOfDay().atOffset(ZoneOffset.UTC) 以 UTC 时间为您提供一天开始时的时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...