我尝试将字符串转换为日期类型。这就是我所做的全部。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHMMMDD");
String date = "23Mar25";
System.out.println(date);
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println(localDate);
我收到了错误信息
Text '23Mar25' could not be parsed:
Unable to obtain LocalDate from TemporalAccessor:
{MonthOfYear=3, DayOfYear=25},ISO resolved to 23:00 of type
java.time.format.Parsed at
java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
有人可以帮我解决吗?
答案 0 :(得分:3)
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
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of ( "America/Montreal" );
LocalDate
通过为我们的LocalDate
对象分配一年来确定MonthDay
个对象。
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
lt:23:00
md: - 03-25
ld: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 );
注意输出,即toString
方法生成的字符串。在解析/生成字符串时,java.time类在默认情况下使用ISO 8601标准格式。我强烈建议您和您的数据源使用这些标准格式,而不是发明您自己的数据源,如问题中所见。 java.time类可以直接解析以及生成这样的标准字符串,而无需指定格式化模式。
要生成其他格式的字符串,请使用DateTimeFormatter
类。许多其他Stack Overflow页面都涵盖了该主题,因此请搜索许多示例和更多讨论。
答案 1 :(得分:0)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHMMMDD");
它使用的模式为:
HH: 2 spaces for hour
MMM: 3 spaces for month
DD: 2 spaces for day
我想你想要一种格式:`ddmmmyy
dd: 2 spaces for day
mmm: 3 spaces for month
yy: 2 spaces for year