您不需要任何格式化程序来解析您的输入字符串
您输入的字符串2006-03-25T10:30:00+12:00
已经是使用的默认格式OffsetDateTime#parse
,因此,您不需要显式使用格式化程序来解析您的输入日期时间字符串。
m
指定分钟同时M
指定月份
您错误地使用m
了符号为 的月份M
。查看文档页面以了解有关这些符号的更多信息。
u
更喜欢y
y
指定纪元(纪元被指定为AD
或BC
)并且始终为正数,而u
指定的年份为带符号 (+/-) 数。通常,我们不使用+
符号来写正数,但我们总是用符号指定负数-
。同样的规则适用于一年。只要你打算使用一年的时代,AD
(大多数情况下都是这样),两者y
都会u
给你相同的数字。但是,当您使用时代的年份时,会出现差异,BC
例如year-of-era,1 BC
指定为year , 0
; 年代,_2 BC
指定为year,-1
依此类推。您可以通过以下演示更好地理解它:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Testing {
public static void main(String[] args) {
System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
System.out.println(LocalDate.of(-1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
System.out.println();
System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
System.out.println(LocalDate.of(0, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
System.out.println();
System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("u M d")));
System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("y M d")));
System.out.println(LocalDate.of(1, 1, 1).format(DateTimeFormatter.ofPattern("yG M d")));
}
}
输出:
-1 1 1
2 1 1
2BC 1 1
0 1 1
1 1 1
1BC 1 1
1 1 1
1 1 1
1AD 1 1
注意:我使用 Java 来演示该解决方案,但它也可以在 Kotlin 中使用。
最终的解决方案:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2006-03-25T10:30:00+12:00");
System.out.println(odt);
// Format it into the desired pattern
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd, MM, uuuu", Locale.US);
String formatted = dtf.format(odt);
System.out.println(formatted);
}
}
输出:
2006-03-25T10:30+12:00
25, 03, 2006
从Trail: Date Time了解有关现代日期时间 API 的更多信息。