首页 > 解决方案 > Joda time - 下次是 X 点钟

问题描述

我需要得到下一个日期时间,比如 20 点。

因此,例如,如果是 13.00 小时,它会给我与今天 20.00 对应的日期时间。

但如果是 21.00,它会在明天 20.00 给我。

我怎样才能做到这一点?是否有一些我找不到名称的内置函数?

在紧要关头,我也可以使用 Java Time 而不是 Joda Time。

标签: javatimejodatimejava-timelocaldatetime

解决方案


DateTime如果时间超过 20:00 ,则添加一天。

演示:

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;

public final class Main {

    public static final void main(String[] args) {
        // Test
        System.out.println(getNextTime("13.00"));
        System.out.println(getNextTime("21.00"));
    }

    static DateTime getNextTime(String strTime) {
        LocalTime time = LocalTime.parse(strTime);
        DateTime dt = DateTime.now(DateTimeZone.getDefault()).withTime(new LocalTime(20, 0));

        if (time.isAfter(new LocalTime(20, 0))) {
            dt = dt.plusDays(1);
        }
        return dt;
    }
}

输出:

2021-03-29T20:00:00.000+01:00
2021-03-30T20:00:00.000+01:00

注意:在Joda-Time主页查看以下通知

Joda-Time 是 Java SE 8 之前 Java 的事实上的标准日期和时间库。现在要求用户迁移到 java.time (JSR-310)。

使用现代日期时间 API:

import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public final class Main {

    public static final void main(String[] args) {
        // Test
        System.out.println(getNextTime("13.00"));
        System.out.println(getNextTime("21.00"));
    }

    static ZonedDateTime getNextTime(String strTime) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH.mm");
        LocalTime time = LocalTime.parse(strTime, dtf);
        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault()).withHour(20);

        if (time.isAfter(LocalTime.of(20, 0))) {
            zdt = zdt.plusDays(1);
        }
        return zdt;
    }
}

输出:

2021-03-29T20:00:18.325419+01:00[Europe/London]
2021-03-30T20:00:18.327587+01:00[Europe/London]

推荐阅读