簡體   English   中英

JodaTime:使用特定間隔獲取兩個日期之間的日期

[英]JodaTime: get date(s) between two dates using specific interval

使用JodaTime,我目前正在檢查開始日期和結束日期之間的天數,如下所示:

todayDate = new DateTime();
expiryDate = new DateTime(dbReportModel.getValidityTime());
lastDate = new DateTime(dbReportModel.getLastDate());

Days dayDifference = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate));

我開始,如果上面的天差小於或等於一些通知我有關的東西用戶int天數:

if (dayDifference.getDays() <= expiryNotificationProperties.getDaysBefore())

該計划每天都在運行。 問題是我不需要每天發送信息。 我只需每隔15天通知一次。

目前我有這種方法使用間隔獲取給定開始日期和結束日期之間的日期列表:

private List<LocalDate> getDatesBetweenExpiryDateTodayDate (DateTime todayDate, DateTime expiryDate, int interval) {
        List<LocalDate> listOfDatesWithInterval = new ArrayList <>();
        int numberOfDays = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate)).getDays();
        LocalDate dynamicExpiryDate = expiryDate.toLocalDate();
        while (numberOfDays > 0) {
            listOfDatesWithInterval.add(dynamicExpiryDate.minusDays(interval));
            dynamicExpiryDate = dynamicExpiryDate.minusDays(interval);
            numberOfDays -= interval;
        }

        return listOfDatesWithInterval;
    }

這是額外的檢查,今天的日期在列表中:

List<LocalDate> listOfDatesUsingInterval = getDatesBetweenExpiryDateTodayDate(todayDate, expiryDate, interval);
if (listOfDatesUsingInterval.contains(todayDate.toLocalDate())) {

是否有可能以更好的方式在JodaTime中這樣做? 是否有內置功能來實現此結果?

如果您無法使用Java8,請嘗試使用Google Guava:

    private static void getDays(DateTime todayDate, DateTime expiryDate, int interval) {
           int numberOfDays = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate)).getDays();
           Range<Integer> open = Range.closed(1, numberOfDays/interval);
           ImmutableList<Integer> integers = ContiguousSet.create(open, DiscreteDomain.integers()).asList();
           FluentIterable.from(integers).transform(new ConvertToDate(interval)).toList().forEach(System.out::println);
}

private static class ConvertToDate implements Function<Integer, DateTime> {
    private final int interval;

    public ConvertToDate(int interval) {
        this.interval = interval;
    }

    @Override
    public DateTime apply(Integer integer) {
        return DateTime.now().plusDays(integer* interval);
    }
}

我不知道它是否是更好的解決方案,但我發現它更容易閱讀。

你可以使用流

    int numberOfDays = Days.daysBetween(LocalDate.now(), LocalDate.now().plusDays(10)).getDays();
    List<LocalDate> collect = Stream.iterate(LocalDate.now(), e -> e.plusDays(1)).limit(numberOfDays).collect(Collectors.toList());
    collect.forEach(System.out::println);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM