2016-11-14 180 views

回答

1

的Java-8,存在对24部分支持:只在解析水平00时(午夜在一天结束时),然后只对LocalTime

全自动的24:00转移到第二天:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
TemporalAccessor parsed = dtf.parse("2016-11-14 24:00"); 
Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays()); 
LocalDateTime ldt = LocalDateTime.from(parsed); 
System.out.println(ldt); 
System.out.println(extraDays); 

输出:

2016-11-15T00:00

P0D(24:00已丢失!!!)

对于LocalDateTime,似乎没有任何方法可以找出原始解析时间是“24:00”。但是,如果与该类型LocalTime工作,然后你就可以查询原来这个时间类似的方式:

DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm"); 
TemporalAccessor parsed2 = dtf2.parse("24:00"); 
Period extraDays2 = parsed2.query(DateTimeFormatter.parsedExcessDays()); 
System.out.println(extraDays2); // P1D 
LocalTime lt = LocalTime.from(parsed2); 
System.out.println(lt); // 00:00 

中给出你可以设置两个格式化,一个只有日期部分,一个用于部分时间最后的例子。但是,您永远无法做的是将时间24:00存储为LocalTime的实例。相反,您必须使用格式化程序方法parsedExcessDays()因此,您发现整体支持非常有限。我发现最好的解决办法是这样的:

DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd "); 
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("HH:mm"); 

String input = "2016-11-14 24:00"; 
ParsePosition pp = new ParsePosition(0); 
LocalDate ld = LocalDate.from(dtf1.parse(input, pp)); 
TemporalAccessor timePart = dtf2.parse(input, pp); 
Period extraDays = timePart.query(DateTimeFormatter.parsedExcessDays()); 
LocalTime lt = LocalTime.from(timePart); 

System.out.println(ld); // 2016-11-14 
System.out.println(lt); // 00:00 
System.out.println(extraDays); // P1D 

也许你可以考虑我的图书馆Time4J为另一种格式,并解析引擎。这里的一个主要区别是:Time4J型PlainTime可以存储值“24:00”。

但是与Java-8类似,PlainTimestamp(作为挂件到LocalDateTime)也会自动传输过多日期到日期部分。主要原因是为了避免排序和实施自然秩序的困难。考虑例如2016-11-14 24:00和2016-11-15 00:00的时间戳。两个值在时间上相等(同时),但不相等(关于整个状态),所以自然顺序与equals()不一致。因此PlainTimestamp不会存储24:00,但会自动将其解析到第二天。

但是你可以使用此解决方案保持单独的日期和时间:

ChronoFormatter<PlainDate> dateF = 
    ChronoFormatter.ofDatePattern("yyyy-MM-dd ", PatternType.CLDR, Locale.ROOT).with(
     Attributes.TRAILING_CHARACTERS, 
     true 
    ); 
ChronoFormatter<PlainTime> timeF = 
    ChronoFormatter.ofTimePattern("HH:mm", PatternType.CLDR_24, Locale.ROOT); 

String input = "2016-11-14 24:00"; 
ParseLog plog = new ParseLog(); 

PlainDate date = dateF.parse(input, plog); 
PlainTime time = timeF.parse(input, plog); 
System.out.println(date); // 2016-11-14 
System.out.println(time); // T24 

当然,转化为Java的8种是一般可能的,但请记住,PlainTimeLocalTime通过转换方法toTemporalAccessor()会将时间值24:00映射到00:00(有损转换)。

相关问题