如何使用 DateTimeFormatter 获得一致性
How to get consistency using DateTimeFormatter
我发现在使用相同 DateTimeFormatter
时看起来相似的输入之间存在不一致。我需要这个来与日期时间的另一个输入源进行比较。
例如,给定这些输入:
2020-06-29T01:00:00+01:00 -> my date time formatter -> 2020-06-29T01:00:00+01:00
2021-08-18T21:00:00+0000 -> my date time formatter -> 2021-08-18T21:00:00Z
我希望输出始终采用 YYYY-mm-ddT00:00:00Z
格式,因此第二个输入会产生我想要的结果。
我目前格式化它的方式:
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4)
.optionalStart()
.appendLiteral("-")
.optionalEnd()
.appendValue(ChronoField.MONTH_OF_YEAR, 2)
.optionalStart()
.appendLiteral("-")
.optionalEnd()
.appendValue(ChronoField.DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendPattern("HH':'mm':'ss[XXX][X]")
.toFormatter();
public OffsetDateTime convert(String dateTime) {
return OffsetDateTime.parse(dateTime, FORMATTER);
}
public String getDateTimeString(OffsetDateTime offsetDateTime) {
return offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
public void doStuff(String input) {
OffsetDateTime odt = convert(input);
String finalResult = getDateTimeString(odt);
}
..
doStuff(input);
我已经仔细研究了几个小时,但文档对我来说不是那么清楚,我遇到了各种各样的麻烦。有什么建议吗?
将 OffsetDateTime
转换为 Instant
以去除时区。
public String getDateTimeString(Instant instant) {
return instant.toString();
}
public void doStuff(String input) {
OffsetDateTime odt = convert(input);
String finalResult = getDateTimeString(odt.toInstant());
System.out.println(finalResult);
}
这与(正确)接受的答案中的方法基本相同,只是另一种写法:
public static String convertToUtcIso(String datetime) {
// parse the given String,and format as ISO OFFSET DATE TIME
return OffsetDateTime.parse(datetime, FORMATTER)
// convert the resulting OffsetDateTime to UTC
.withOffsetSameInstant(ZoneOffset.UTC)
// and format it according to ISO standard
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
由于(更多)清楚地指出一天中的时间将调整为具有 0 小时的偏移量,因此可读性存在细微差异。
与接受的答案一样,示例日期时间 "2020-06-29T01:00:00+01:00"
将转换为 "2020-06-29T00:00:00Z"
(01:00 AM ⇒ 00:00 AM)。
我发现在使用相同 DateTimeFormatter
时看起来相似的输入之间存在不一致。我需要这个来与日期时间的另一个输入源进行比较。
例如,给定这些输入:
2020-06-29T01:00:00+01:00 -> my date time formatter -> 2020-06-29T01:00:00+01:00
2021-08-18T21:00:00+0000 -> my date time formatter -> 2021-08-18T21:00:00Z
我希望输出始终采用 YYYY-mm-ddT00:00:00Z
格式,因此第二个输入会产生我想要的结果。
我目前格式化它的方式:
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4)
.optionalStart()
.appendLiteral("-")
.optionalEnd()
.appendValue(ChronoField.MONTH_OF_YEAR, 2)
.optionalStart()
.appendLiteral("-")
.optionalEnd()
.appendValue(ChronoField.DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendPattern("HH':'mm':'ss[XXX][X]")
.toFormatter();
public OffsetDateTime convert(String dateTime) {
return OffsetDateTime.parse(dateTime, FORMATTER);
}
public String getDateTimeString(OffsetDateTime offsetDateTime) {
return offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
public void doStuff(String input) {
OffsetDateTime odt = convert(input);
String finalResult = getDateTimeString(odt);
}
..
doStuff(input);
我已经仔细研究了几个小时,但文档对我来说不是那么清楚,我遇到了各种各样的麻烦。有什么建议吗?
将 OffsetDateTime
转换为 Instant
以去除时区。
public String getDateTimeString(Instant instant) {
return instant.toString();
}
public void doStuff(String input) {
OffsetDateTime odt = convert(input);
String finalResult = getDateTimeString(odt.toInstant());
System.out.println(finalResult);
}
这与(正确)接受的答案中的方法基本相同,只是另一种写法:
public static String convertToUtcIso(String datetime) {
// parse the given String,and format as ISO OFFSET DATE TIME
return OffsetDateTime.parse(datetime, FORMATTER)
// convert the resulting OffsetDateTime to UTC
.withOffsetSameInstant(ZoneOffset.UTC)
// and format it according to ISO standard
.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
由于(更多)清楚地指出一天中的时间将调整为具有 0 小时的偏移量,因此可读性存在细微差异。
与接受的答案一样,示例日期时间 "2020-06-29T01:00:00+01:00"
将转换为 "2020-06-29T00:00:00Z"
(01:00 AM ⇒ 00:00 AM)。