第一步我们生成时间戳格式的日期; 第二步(我们的应用程序的其他功能),我们只需要提取日期;重要的是保持前一天而不是午后。如何在oracle和java中保留24小时00分钟的时间戳值
感谢您的支持。
RL
第一步我们生成时间戳格式的日期; 第二步(我们的应用程序的其他功能),我们只需要提取日期;重要的是保持前一天而不是午后。如何在oracle和java中保留24小时00分钟的时间戳值
感谢您的支持。
RL
在的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种是一般可能的,但请记住,PlainTime
到LocalTime
通过转换方法toTemporalAccessor()
会将时间值24:00映射到00:00(有损转换)。