如何将字符串转换为日期(HHMMMDD)(小时,月,日)

时间:2017-04-01 00:36:07

标签: java string date datetime converter

我尝试将字符串转换为日期类型。这就是我所做的全部。

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)

有人可以帮我解决吗?

2 个答案:

答案 0 :(得分:3)

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/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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类代替ZoneIdZonedDateTime,而代码与上述类似。

OffsetDateTime zdt = OffsetDateTime.of ( ld, lt, ZoneOffset.UTC );

ISO 8601

注意输出,即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