java - 如何在oracle和java中的时间戳值中保留24小时00分钟

标签 java time timestamp

第一步,我们生成时间戳格式的日期; 在第二步(我们应用程序的其他功能)中,我们只需要提取日期;重要的是要保留午夜前一天而不是午夜后一天。

感谢您的支持。

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 has been lost!!!)

对于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 类型是可能的,但请记住,通过 toTemporalAccessor 方法将 PlainTime 转换为 LocalTime () 会将时间值 24:00 映射到 00:00(有损转换)。

关于java - 如何在oracle和java中的时间戳值中保留24小时00分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40587668/

相关文章:

scala - 使用 Scala 将字符串转换为 Spark 的时间戳

javascript - PDFBox setOpenAction 打印

java - 我的 CS I 类(class)有什么问题吗?

java - 布局更改后设置 onClickListener 不起作用

javascript - Sencha Touch 2 日期选择器组件和 css : how to display hidden column names?

java - 记录生成的 MIDI 事件 : inner conversion from timestamps to midi file delta time

java - 如何在 java 中绘制带星号的半箭头?

C 编程时间和时钟函数

javascript - 如何在 Three.js 中随时间添加/删除对象

java - 如何比较Java中的两个utc时间戳?