tl;博士
LocalTime.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
.toString() // 23:00
……和……
MonthDay.parse( "23Mar25" , DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US )
.toString() // --03-25
详情
如果您确定输入确实代表一天中的某个小时、一个月和一天中的某天……
DateTimeFormatter
定义一个DateTimeFormatter。请务必指定 Locale 用于翻译月份缩写名称的人类语言。
String input = "23Mar25";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "HHMMMdd", Locale.US );
LocalTime
使用该格式化程序两次。一次生成时间作为LocalTime 对象来保存时间。
LocalTime lt = LocalTime.parse ( input, f );
MonthDay
再次生成一个MonthDay 对象来保存月份和日期。
MonthDay md = MonthDay.parse ( input , f );
ZoneId
要确定该值的特定时刻,我们必须指定年份和时区。如果我们想使用当前年份,我们也需要一个时区。请记住,在任何特定时刻,日期和时间在全球各地都会因地区而异。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
ZoneId z = ZoneId.of ( "America/Montreal" );
LocalDate
通过为我们的MonthDay 对象分配年份来确定LocalDate 对象。
int yearNumber = Year.now ( z )
.getValue ( ) ;
LocalDate ld = md.atYear ( yearNumber );
ZonedDateTime
与LocalTime 结合以获得准确的时刻,即时间线上的一个点。结果是一个ZonedDateTime 对象。
ZonedDateTime zdt = ZonedDateTime.of ( ld, lt, z );
转储到控制台。
System.out.println ( "input: " + input );
System.out.println ( "lt: " + lt );
System.out.println ( "md: " + md );
System.out.println ( "ld: " + ld );
System.out.println ( "zdt: " + zdt );
输入:23Mar25
时间:23:00
md: --03-25
日期:2017-03-25
zdt: 2017-03-25T23:00-04:00[美国/蒙特利尔]
OffsetDateTime
如果您的输入是针对UTC 的,那么在与上面类似的代码中使用ZoneOffset.UTC 常量和OffsetDateTime 类,而不是ZoneId 和ZonedDateTime。
OffsetDateTime zdt = OffsetDateTime.of ( ld, lt, ZoneOffset.UTC );
ISO 8601
注意输出,toString 方法生成的字符串。 java.time 类在解析/生成字符串时默认使用ISO 8601 标准格式。我强烈建议您和您的数据源使用这些标准格式,而不是像问题中看到的那样发明自己的格式。 java.time 类可以直接解析和生成这样的标准字符串,而无需指定格式模式。
要生成其他格式的字符串,请使用DateTimeFormatter 类。许多其他 Stack Overflow 页面都涵盖了该主题,因此请搜索许多示例和更多讨论。