如何在java中表示和操作大于24:00的时间值?

qyzbxkaa  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(645)

我目前正在一个应用程序域中做一些工作,它使用大于24:00的时间值来表示午夜之后仍然与前一天的细节相关的时间。例如,它可能使用星期一的25:15来表示星期二的凌晨1:15,因为从域的Angular 来看,这个值仍然与星期一的数据相关联。
维基百科关于24小时制的文章中简要提到了这种时间使用方式:
超过24:00的时间符号(例如24:01或25:00而不是00:01或01:00)不常用,也不在相关标准的范围内。然而,在[各个国家]的一些特殊情况下,有时也会用到这些词,因为工作时间超过午夜,例如广播电视制作和调度。
java提供了 LocalTime 表示时间的模型类。然而, LocalTime 限制在给定日期的午夜(含)和第二天的午夜(不含)之间,即在范围内 [0:00-23:59:59.999999999] .
javatimeapi是灵活编写的,但是核心api中排除了更专门的概念。正如java 8日期与时间库的主要作者策划的“三个额外的项目”中所提到的:
并非所有的日期/时间逻辑都是为jdk设计的。有些概念太过专业化或太过庞大,难以理解。
我还没有幸运地找到一个现有的类型或其他直接的方法来通过核心java库或额外的310个库来建模这个不那么受限的时间类型。然而,很有可能我遗漏了什么,也许是一些相当明显的东西。
我如何在java中对这种不受约束的时间建模,最好使用 java.time api或它的一个扩展的la的三个额外的项目?我希望能够使用它以文本形式表示时间值(“25:15”),并理想地使用它执行时间计算(例如,将“星期一@25:15”转换为“星期二@1:15 am”)。
如果没有直截了当的方法,我很可能会在“三个十”额外项目中打开一个问题。

ghhkc1vu

ghhkc1vu1#

不,那不存在

我确信,三十家的课程或其他地方常用的课程都不能满足你的需求。我能找到的最接近的就是 DayCycles time4j库的类(链接在底部)。它由一天中的某个时间(a)组成 PlainTime )与一个未指明的日期相对的天数,所以你要求什么;但它是专门用来返回一个 PlainTime 而且不提供任何自己的功能。

自己旋转

我不认为开发自己的类可以与java.time进行互操作会太难。很可能是因为 java.time.Duration 正如mark b所建议的,取决于更精确的要求。
如果您对解析和格式化有严格的要求,那么解析和格式化可能是最困难的部分。可能值得从joda时间库的源代码中获得灵感,因为它包括格式化和解析持续时间的工具。
另一个灵感来源是 java.time.LocalTime .
以下是最开始的几点:

public class SpecializedTime {

    private Duration timeSince0000;

    private SpecializedTime(Duration timeSince0000) {
        this.timeSince0000 = timeSince0000;
    }

    static SpecializedTime parse(String text, DateTimeFormatter formatter) {
        ParsePosition position = new ParsePosition(0);
        TemporalAccessor parsed = formatter.parseUnresolved(text, position);
        if (position.getErrorIndex() != -1) {
            throw new DateTimeParseException("Parse error", text, position.getErrorIndex());
        }
        if (position.getIndex() != text.length()) {
            throw new DateTimeParseException("Unparsed text", text, position.getIndex());
        }
        if (! parsed.isSupported(ChronoField.HOUR_OF_DAY)) {
            throw new DateTimeParseException("Cannot resolve", text, 0);
        }

        Duration time = Duration.ofHours(parsed.getLong(ChronoField.HOUR_OF_DAY));
        if (parsed.isSupported(ChronoField.MINUTE_OF_HOUR)) {
            int minuteOfHour = parsed.get(ChronoField.MINUTE_OF_HOUR);
            // Should validate, 0..59
            time = time.plusMinutes(minuteOfHour);
        }
        // Same for seconds and nanoseconds

        return new SpecializedTime(time);
    }

    @Override
    public String toString() {
        return String.format("%02d:%02d", timeSince0000.toHours(), timeSince0000.toMinutesPart());
    }

}

演示:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("H:m");
        SpecializedTime st = SpecializedTime.parse("25:15", timeFormatter);
        System.out.println(st);

输出:
25:15

链接

文件 DayCycles 表格时间4J

z9zf31ra

z9zf31ra2#

我的第一个想法是将其存储为duration对象。您可以很容易地使用该类上的getter来构造 HH:mm 字符串,或者使用类似于apachecommons durationformatutils的内容。
这个 LocalDate 以及 LocalDateTime 类支持加减持续时间之类的操作。

相关问题