首页 > 解决方案 > java拆分日期时间段并返回数组

问题描述

我正在使用简单的 jsp 在 java 中构建一个 Web 应用程序,我想知道是否有一种方法可以获取介于和 datetime_stop per之间的datetime值数组。我正在寻找类似的东西:datetime_starthours/day/minutes/etc

Array getvalues(datetime_start, datetime_stop, "day/hours/min")

例如:

getvalues("2018-07-02 20:25:08.208812","2018-07-03 20:25:08.208812","hours");

它返回:

2018-07-02 20:25:08.208812 <br>
2018-07-02 21:25:08.208812<br>
2018-07-02 22:25:08.208812<br>
2018-07-02 23:25:08.208812<br>
2018-07-02 24:25:08.208812<br>
2018-07-02 01:25:08.208812<br>
2018-07-02 02:25:08.208812<br>
2018-07-02 03:25:08.208812<br>
2018-07-02 04:25:08.208812<br>
2018-07-02 05:25:08.208812<br>
2018-07-02 06:25:08.208812<br>
2018-07-02 07:25:08.208812<br>
2018-07-02 08:25:08.208812<br>
2018-07-02 09:25:08.208812<br>
2018-07-02 10:25:08.208812<br>
2018-07-02 11:25:08.208812<br>
2018-07-02 12:25:08.208812<br>
2018-07-02 13:25:08.208812<br>
2018-07-02 14:25:08.208812<br>
2018-07-02 15:25:08.208812<br>
2018-07-02 16:25:08.208812<br>
2018-07-02 17:25:08.208812<br>
2018-07-02 18:25:08.208812<br>
2018-07-02 19:25:08.208812<br>
2018-07-02 20:25:08.208812<br>

谁能帮助我?

标签: javajspdatetimesplit

解决方案


这是获得所需结果的简单方法。您可能想要添加更多检查,例如输入有效性检查和处理。

包含主要逻辑的实用程序类:

public class PeriodicDateTimeProducer {
    private static final DateTimeFormatter DATE_TIME_FORMATTER =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
    public List<LocalDateTime> getPeriodicDateTime(String start, String end, PeriodMeasure measure){
        LocalDateTime startDateTime = LocalDateTime.parse(start, DATE_TIME_FORMATTER);
        LocalDateTime endDateTime = LocalDateTime.parse(end, DATE_TIME_FORMATTER);

        List<LocalDateTime> results = new ArrayList<>();

        // Use isAfter instead of isBefore becoz you want to include the endDateTime, if it's a valid result
        while(!startDateTime.isAfter(endDateTime)){
            results.add(startDateTime);
            startDateTime = startDateTime.plus(1, measure.getChronoUnit());
        }

        return results;
    }
}

帮助您限制可以使用哪些单位的枚举。它还有助于减少由拼写错误引起的错误:

public enum PeriodMeasure{
    DAY(ChronoUnit.DAYS),
    HOUR(ChronoUnit.HOURS),
    MINUTE(ChronoUnit.MINUTES);

    PeriodMeasure(ChronoUnit unit){
        this.unit = unit;
    }

    private ChronoUnit unit;

    public ChronoUnit getChronoUnit(){
        return this.unit;
    }
}

测试人员类:

public class TestPeriodicDateTime {
    private static final DateTimeFormatter DATE_TIME_FORMATTER =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
    public static void main (String... args){
        PeriodicDateTimeProducer dateTimeUtil = new PeriodicDateTimeProducer();

        List<LocalDateTime> rst = dateTimeUtil.getPeriodicDateTime("2018-07-02 20:25:08.208812", "2018-07-03 20:25:08.208812", PeriodMeasure.HOUR);

        rst.forEach(r -> System.out.println(DATE_TIME_FORMATTER.format(r)));
    }
}

结果:

2018-07-02 20:25:08.208812
2018-07-02 21:25:08.208812
2018-07-02 22:25:08.208812
2018-07-02 23:25:08.208812
2018-07-03 00:25:08.208812
2018-07-03 01:25:08.208812
2018-07-03 02:25:08.208812
2018-07-03 03:25:08.208812
2018-07-03 04:25:08.208812
2018-07-03 05:25:08.208812
2018-07-03 06:25:08.208812
2018-07-03 07:25:08.208812
2018-07-03 08:25:08.208812
2018-07-03 09:25:08.208812
2018-07-03 10:25:08.208812
2018-07-03 11:25:08.208812
2018-07-03 12:25:08.208812
2018-07-03 13:25:08.208812
2018-07-03 14:25:08.208812
2018-07-03 15:25:08.208812
2018-07-03 16:25:08.208812
2018-07-03 17:25:08.208812
2018-07-03 18:25:08.208812
2018-07-03 19:25:08.208812
2018-07-03 20:25:08.208812

Process finished with exit code 0

该解决方案的主要思想:

  1. 使用DateTimeFormatter指定您想要的格式;
  2. LocalDateTime.isBefore()将返回 false 对于相同的LocalDateTime ,所以如果你想包含endDateTime ,你应该使用!isAfter(),如果它是一个有效的结果;
  3. 使用常量(静态最终)格式化程序强制函数的用户使用特定格式。但是,如果您需要一个支持变量DateTimeFormatter的解决方案,您也可以通过将 formmater 属性设置为非常量来实现(或者简单地将其添加为方法的参数,这可能是不希望的,因为您最终会得到太多参数);
  4. 使用枚举来控制期间允许的ChronoUnit集。这不仅会强制执行更清晰、更易于管理的代码,而且还可以让您更好地控制逻辑,从而减少出错的可能性;

推荐阅读