Java 从GregorianCalendar获取一天中最近而非未来的时间

Java 从GregorianCalendar获取一天中最近而非未来的时间,java,gregorian-calendar,Java,Gregorian Calendar,我需要将我的GregoriaCalendar设置为一天中的一个特定小时,这是最近的时间,但不是将来的时间。 如果现在的时间是21:00,我需要将时间设置为22:00,那么将设置为昨天。但是如果现在的时间是23:00,那么就定在今天 LocalTime hour = LocalTime.of(22, 0); ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Indiana/Marengo")); ZonedDa

我需要将我的GregoriaCalendar设置为一天中的一个特定小时,这是最近的时间,但不是将来的时间。 如果现在的时间是21:00,我需要将时间设置为22:00,那么将设置为昨天。但是如果现在的时间是23:00,那么就定在今天

    LocalTime hour = LocalTime.of(22, 0);
    ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Indiana/Marengo"));
    ZonedDateTime closestHour = now.with(hour);
    if (closestHour.isAfter(now)) { // future
        closestHour = now.minusDays(1).with(hour);
    }

    System.out.println(closestHour);
这是印刷的

2018-02-04T22:00-05:00[America/Indiana/Marengo]
以上是一个草图,而不是准备生产的代码。如果不是美国/印第安纳/马伦戈,你需要提供你想要的时区。当然,还有所需的时钟时间。如果所需的时间不存在,通常在春季过渡到夏季,您将选择不同的时间,您将需要检测该时间并相应地采取行动

java.time 您要求使用GregorianCalendar,我会给您一个,但请允许我指出,该类早已过时且设计拙劣,因此您不应该想要一个。我建议您使用java.time,这是现代的java日期和时间API

如果您需要一个或只是一个遗留API的对象,而您现在无法更改或不想更改,请按如下方式转换:

    GregorianCalendar cal = GregorianCalendar.from(closestHour);
链接:

检查getTime返回的值是否大于或小于new Date。如果它更大,你设定天数-否则你什么也不做