tl;博士
LocalDateTime ldt = LocalDateTime.parse ( "1515010" , DateTimeFormatter.ofPattern ( "yyDHH" ) );
LocalDate ld = LocalDate.parse ( "15150" , DateTimeFormatter.ofPattern ( "yyD" ) );
不是朱利安……序数日期
使用术语“朱利安”来表示一年中的有序数字在技术上并不正确,但仍然普遍使用。我建议您避免与实际的儒略日期产生歧义和混淆,并坚持使用准确的术语序数日期或“一年中的日期”。
java.time
Java 8 及更高版本中内置的java.time框架可以在这里提供帮助。下面的示例代码证明您的两种方案(有和没有时间)在 java.time 中都能正常工作。
这些 java.time 类取代了旧的麻烦的日期时间类,例如java.util.Date
. 请参阅Oracle 教程。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
使用类定义格式化程序模式DateTimeFormatter
。格式代码与 的相似SimpleDateFormat
,但不完全相同,因此请研究类文档。对于此类,如果省略世纪,20xx
则假定为 21 世纪 ( )。
String input = "1515010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyDHH" );
LocalDateTime ldt = LocalDateTime.parse ( input , formatter );
ALocalDateTime
缺少任何时区或与 UTC 的偏移信息。所以它并不代表时间线上的一个时刻。如果我们可以假设此输入的目的是在 UTC 时区的上下文中,则转换为OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset ( ZoneOffset.UTC );
转储到控制台。
System.out.println ( "input: " + input + " | ldt: " + ldt + " | odt: " + odt );
输入:1515010 | 日期:2015-05-30T10:00 | odt: 2015-05-30T10:00Z
对于没有时间和时区的仅日期值,我们实例化一个LocalDate
.
String input = "15150";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyD" );
LocalDate ld = LocalDate.parse ( input , formatter );
转储到控制台。
System.out.println ( "input: " + input + " | ld: " + ld );
输入:15150 | 日期:2015-05-30