java - 如何从一年中的日期向下迭代到上一年的日期?
问题描述
我有一个开始日期,假设是 2020-12-30 08:00:00,我有一个结束日期,假设是 2021-02-11 16:00:00。
我需要通过以下方式获取这些天之间的时间:
long diffInHours = TimeUnit.HOURS.convert(Math.abs(closeStoreDateTime.getTime() - openStoreDateTime.getTime()), TimeUnit.MILLISECONDS);
我的问题是,当我从结束日期向下迭代到开始日期时,我将当前时间和开始时间之间的小时差转换为准确的时间,以便稍后存储在地图中。像这样:
int latestHour = (int) diffInHours;
while (latestHour >= openStoreDateTime.toInstant().atZone(ZoneId.systemDefault()).getHour()) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(ZoneId.systemDefault()));
String hourConversion;
if (closeStoreDateTime.toInstant().atZone(ZoneId.systemDefault()).getDayOfYear() > openStoreDateTime.toInstant().atZone(ZoneId.systemDefault()).getDayOfYear()) {
if (latestHour > 24) {
calendar.add(Calendar.HOUR_OF_DAY, latestHour);
hourConversion = calendar.get(Calendar.AM_PM) == Calendar.AM ? String.valueOf(calendar.get(Calendar.HOUR)) : String.valueOf(calendar.get(Calendar.HOUR) + 12);
} else {
calendar.add(Calendar.HOUR_OF_DAY, latestHour);
int AM_PM = calendar.get(Calendar.AM_PM);
if (AM_PM == Calendar.AM || (AM_PM == Calendar.PM && calendar.get(Calendar.HOUR) == 12)) {
hourConversion = String.valueOf(calendar.get(Calendar.HOUR));
} else {
hourConversion = String.valueOf(calendar.get(Calendar.HOUR) + 12);
}
}
} else {
hourConversion = String.valueOf(latestHour);
}
如果日期在同一年内,则此方法有效,但如果它们在不同年份,则无效,因为开始年份 (363) 中的日期大于结束年份中的日期。有谁知道如何将 2 个不同日期之间的小时数转换为可用日期?谢谢你。
解决方案
如果我正确理解您的问题,您需要List
从结束日期时间到开始日期时间的日期时间值,每小时一个。
以下是一些测试结果。
2021-02-11T16:00
2021-02-11T15:00
2021-02-11T14:00
2021-02-11T13:00
2021-02-11T12:00
...
2020-12-30T12:00
2020-12-30T11:00
2020-12-30T10:00
2020-12-30T09:00
2020-12-30T08:00
这是使用LocalDateTime
该类执行此操作的可运行代码。您可以LocalDateTime
使用DateTimeFormatter
.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class DateIntervals {
public static void main(String[] args) {
String endDateString = "2021-02-11 16:00:00";
String startDateString = "2020-12-30 08:00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd HH:mm:ss");
LocalDateTime endDate = LocalDateTime.parse(endDateString, formatter);
LocalDateTime startDate = LocalDateTime.parse(startDateString, formatter);
List<LocalDateTime> intervals = new ArrayList<>();
LocalDateTime date = endDate;
while (date.isAfter(startDate)) {
intervals.add(date);
date = date.minusHours(1L);
}
intervals.add(date);
for (int i = 0; i < intervals.size(); i++) {
System.out.println(intervals.get(i));
}
}
}
推荐阅读
- c++ - 对象创建必须使用哪种设计模式?
- r - 如何选择具有相同数字绝对值的行
- dataset - 报表服务器 2016 无法从共享数据集中加载数据
- reactjs - 用 Jest 反应单元测试 - 模拟 localStorage 的问题
- java - 如何在此应用程序中添加在前台花费的总时间而不是上次使用的时间?
- android - Google Play 开发者控制台中的奇怪统计数据
- reactjs - 在反应应用程序中使用轮播时出错
- mysql - 如何修复学说(Symfony 4)中发生的异常?
- node.js - 在 nodejs 上使用 javascript 开发“分类”应用程序
- spring - Spring Batch - 从另一个具有重试机制的Tasklet调用Tasklet?