java - java拆分日期时间段并返回数组
问题描述
我正在使用简单的 jsp 在 java 中构建一个 Web 应用程序,我想知道是否有一种方法可以获取介于和 datetime_stop per之间的datetime
值数组。我正在寻找类似的东西:datetime_start
hours/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>
谁能帮助我?
解决方案
这是获得所需结果的简单方法。您可能想要添加更多检查,例如输入有效性检查和处理。
包含主要逻辑的实用程序类:
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
该解决方案的主要思想:
- 使用DateTimeFormatter指定您想要的格式;
- LocalDateTime.isBefore()将返回 false 对于相同的LocalDateTime ,所以如果你想包含endDateTime ,你应该使用!isAfter(),如果它是一个有效的结果;
- 使用常量(静态最终)格式化程序强制函数的用户使用特定格式。但是,如果您需要一个支持变量DateTimeFormatter的解决方案,您也可以通过将 formmater 属性设置为非常量来实现(或者简单地将其添加为方法的参数,这可能是不希望的,因为您最终会得到太多参数);
- 使用枚举来控制期间允许的ChronoUnit集。这不仅会强制执行更清晰、更易于管理的代码,而且还可以让您更好地控制逻辑,从而减少出错的可能性;
推荐阅读
- jquery - .net MVC 5.0 bootstrap Datetimepicker 不是函数问题
- php - Json表php空记录
- python - 使用带有 unicode 转义的 f 字符串
- python - eyed3 在加载 mp3 文件时返回 None
- java - 给定一个 Gradle 项目,如何将 `build.gradle.kts` 文件中的 JAR 依赖项提取到给定文件夹?
- linux - 通过匹配特定列来连接两个文件
- node.js - Node.js 脚本复制文件覆盖以前的文件?
- powershell - Powershell:复制Excel数据透视图并保存
- flutter - Flutter 创建密码规则对话框
- tf.keras - 将函数应用于 tf.keras.Model 输出到批次中的每个样本