Java / Quartz中更干净的日期处理方式

时间:2018-09-18 14:56:06

标签: date datetime syntax quartz-scheduler java-time

为了以编程方式安排一天的工作(使用石英),我不得不弄出这样的代码:

Date.from(LocalDateTime.from(Instant.now()).plusDays(1).toInstant(ZoneOffset.ofHours(-3)))

难道没有一种方法可以使这段怪异的代码更干净,更易读吗?

我的目标是简单地选择这一刻并添加一天,而不用担心时区或在给定几天的持续时间中没有多少差异。

编辑

更具体地说,我需要一个java.util.Date来表示比创建日期多一天的时间。

2 个答案:

答案 0 :(得分:3)

您选择的标题通常要求在Java中输入日期,但是您的问题和标签表明您可能对某些特定于Quartz的解决方案感兴趣,例如此类(假设您使用的是TriggerBuilder) :

TriggerBuilder tb = ...; // initialize your tb

// Option 1
Trigger trigger = tb
        .withSchedule(/* pick your flavor */)
        .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.DAY))
        .build();

// Option 2
LocalDateTime now = LocalDateTime.now();
Trigger trigger2 = tb
        .withSchedule(/* pick your flavor */)
        .startAt(DateBuilder.tomorrowAt(now.getHour(), now.getMinute(), now.getSecond()))
        .build();

有关更多信息,请检查DateBuilder API

答案 1 :(得分:1)

我对两种形式都无偏好。这一个:

    Date sameTimeTomorrow = Date.from(Instant.now().plus(Duration.ofDays(1)));

或者这个:

    Date sameTimeTomorrow = Date.from(Instant.now().plus(1, ChronoUnit.DAYS));

但是请注意,这会增加24小时,而无需考虑夏季时间或其他异常情况。例如:在我的时区,夏季时间在10月27日至28日之间的夜晚结束。因此,如果我在10月27日中午12点进行上述操作,由于时间已更改,我将在10月28日在我所在的时区13日。如果我需要再次中午12点,我需要:

    Date sameTimeTomorrow = Date.from(
            ZonedDateTime.now(ZoneId.of("America/Sao_Paulo")).plusDays(1).toInstant());

请替换您的正确时区。