在java中如何在日期和时间之间切换
我需要指定时间内的日期 例1: 让我的当前时间为:15-06-2018 08:00AM 如果我提供24小时前作为输入,我需要日期为2018年6月14日和2018年6月15日,因为我当前实例的24小时也意味着昨天的日期 例2: 让我的当前时间为:15-06-2018 08:00AM 如果我在7小时前输入,我需要日期为2018年6月15日,因为距离我当前实例的7小时意味着只有今天的日期 我尝试使用下面的代码,但没有给出预期的结果。请建议是否有更好的方法:在java中如何在日期和时间之间切换,java,date,java-stream,Java,Date,Java Stream,我需要指定时间内的日期 例1: 让我的当前时间为:15-06-2018 08:00AM 如果我提供24小时前作为输入,我需要日期为2018年6月14日和2018年6月15日,因为我当前实例的24小时也意味着昨天的日期 例2: 让我的当前时间为:15-06-2018 08:00AM 如果我在7小时前输入,我需要日期为2018年6月15日,因为距离我当前实例的7小时意味着只有今天的日期 我尝试使用下面的代码,但没有给出预期的结果。请建议是否有更好的方法: pre = LocalDateTime.no
pre = LocalDateTime.now().minusMinutes(duration);
numOfDaysBetween = ChronoUnit.DAYS.between(pre,
LocalDateTime.now().plusDays(1));
System.out.println(numOfDaysBetween);
if (numOfDaysBetween > 0) {
dateList = IntStream.iterate(0, i -> i + 1).limit(numOfDaysBetween).mapToObj(i -> pre.plusDays(i)).collect(Collectors.toList());
for (LocalDateTime d : dateList) {
System.out.println(String.format("%04d", d.getYear()) + "." + String.format("%02d", d.getMonthValue()) + "." + String.format("%02d", d.getDayOfMonth()));
}
}
输入/输出结果
+-------+------------+
| Input | Output |
+-------+------------+
| 24 | 2018-06-20 |
| | 2018-06-21 |
+-------+------------+
| 9 | 2018-06-20 |
| | 2018-06-21 |
+-------+------------+
| 7 | 2018-06-21 |
+-------+------------+
虽然,如果你想避免夏日储蓄的怪癖,你可以考虑使用一些更像……/P>的东西。
Instant now = Instant.parse("2018-06-21T08:40:00.00Z");
Instant then = now.minus(9, ChronoUnit.HOURS);
Instant start;
Instant target;
int delta = 1;
if (then.isBefore(now)) {
start = then;
target = now;
} else {
start = now;
target = then;
delta = -1;
}
if (!target.truncatedTo(ChronoUnit.DAYS).equals(start.truncatedTo(ChronoUnit.DAYS))) {
target = target.plus(1, ChronoUnit.DAYS);
}
while (start.isBefore(target)) {
System.out.println(start);
start = start.plus(delta, ChronoUnit.DAYS);
}
输入/输出结果
+-------+----------------------+
| Input | Output |
+-------+----------------------+
| 24 | 2018-06-20T08:40:00Z |
| | 2018-06-21T08:40:00Z |
+-------+----------------------+
| 9 | 2018-06-20T23:40:00Z |
| | 2018-06-21T23:40:00Z |
+-------+----------------------+
| 7 | 2018-06-21T01:40:00Z |
+-------+----------------------+
输入/输出结果
+-------+------------+
| Input | Output |
+-------+------------+
| 24 | 2018-06-20 |
| | 2018-06-21 |
+-------+------------+
| 9 | 2018-06-20 |
| | 2018-06-21 |
+-------+------------+
| 7 | 2018-06-21 |
+-------+------------+
虽然,如果你想避免夏日储蓄的怪癖,你可以考虑使用一些更像……/P>的东西。
Instant now = Instant.parse("2018-06-21T08:40:00.00Z");
Instant then = now.minus(9, ChronoUnit.HOURS);
Instant start;
Instant target;
int delta = 1;
if (then.isBefore(now)) {
start = then;
target = now;
} else {
start = now;
target = then;
delta = -1;
}
if (!target.truncatedTo(ChronoUnit.DAYS).equals(start.truncatedTo(ChronoUnit.DAYS))) {
target = target.plus(1, ChronoUnit.DAYS);
}
while (start.isBefore(target)) {
System.out.println(start);
start = start.plus(delta, ChronoUnit.DAYS);
}
输入/输出结果
+-------+----------------------+
| Input | Output |
+-------+----------------------+
| 24 | 2018-06-20T08:40:00Z |
| | 2018-06-21T08:40:00Z |
+-------+----------------------+
| 9 | 2018-06-20T23:40:00Z |
| | 2018-06-21T23:40:00Z |
+-------+----------------------+
| 7 | 2018-06-21T01:40:00Z |
+-------+----------------------+
这就是为什么
ZoneId zone=ZoneId.of(“澳大利亚/悉尼”);
ZonedDateTime now=ZonedDateTime.now(区域);
持续时间=持续时间(16小时);
LocalDate preDate=now.减号(持续时间).toLocalDate();
LocalDate endExclusive=now.toLocalDate().plusDays(1);
列表日期列表
=preDate.datesUntil(endExclusive.collect(Collectors.toList());
System.out.println(日期列表);
刚刚跑步(悉尼14:30),我得到了以下结果:
[2018-06-202018-06-21]
其他技巧:使用zoneDateTime
查找开始。会有一些极端情况,例如在往返夏季时间(DST)的传输过程中,LocalDateTime
不会给出正确的结果
并明确指定时区。即使您只是指定了ZoneId.systemDefault()
,您也在告诉读者——以及您自己——您已经有意识地选择了要使用的时区
你的代码出了什么问题?
从现在到7小时前还有0天。或者23小时前ChronoUnit.DAYS.between
仅计算整天。要获得正确的日期数,您需要在计数之前将日期转换为LocalDate
。这就是为什么
ZoneId zone=ZoneId.of(“澳大利亚/悉尼”);
ZonedDateTime now=ZonedDateTime.now(区域);
持续时间=持续时间(16小时);
LocalDate preDate=now.减号(持续时间).toLocalDate();
LocalDate endExclusive=now.toLocalDate().plusDays(1);
列表日期列表
=preDate.datesUntil(endExclusive.collect(Collectors.toList());
System.out.println(日期列表);
刚刚跑步(悉尼14:30),我得到了以下结果:
[2018-06-202018-06-21]
其他技巧:使用zoneDateTime
查找开始。会有一些极端情况,例如在往返夏季时间(DST)的传输过程中,LocalDateTime
不会给出正确的结果
并明确指定时区。即使您只是指定了ZoneId.systemDefault()
,您也在告诉读者——以及您自己——您已经有意识地选择了要使用的时区
你的代码出了什么问题?
从现在到7小时前还有0天。或者23小时前
ChronoUnit.DAYS.between
仅计算整天。要获得正确的日期数,您需要在计数前将日期转换为LocalDate
。加/减小时数
?早小时数。。。减去我需要的。我输入的任何时间段都应该从当前时间开始执行ago操作。我知道在C#中,在日期时间上,这会起作用——plusDays(-N)。我不确定Java,但我认为它是相似的。然后,您可以在currDay加/减小时
?前小时。。。减去我需要的。我输入的任何时间段都应该从当前时间开始执行ago操作。我知道在C#中,在日期时间上,这会起作用——plusDays(-N)。我不确定Java,但我认为它是相似的。然后你可以在currDay0
days)。不确定如何修复即时
,可能已经修复了LocalDat
我正在努力理解,如果我错了,请纠正我。。我们使用的第一个代码片段是日期是否早于目标时间,并且我们相应地增加了一天。。如果两天之间的差异未给出预期结果,则使用第二个代码段。是这样吗?很高兴你能解释第一个代码段第一个代码段工作得很有魅力,有各种输入,我得到了预期的输出。谢谢@MadProgrammer。但当前实例的第二个代码段是8:40,使用9小时前的代码段将输出作为今天的日期。理想情况下,它应该给我今天和昨天,我得到的第一个SwitpPt可能是一个问题,日光节约的时间实例或LoalDaltTimeTimes考虑我的本地机器时区,对吗?或者通常是UTC?部分问题是,-9小时在技术上不是“天”差(返回0
days)。不确定如何修复即时
,可能已经修复了LocalDat
我正在努力理解,如果我错了,请纠正我。。我们使用的第一个代码片段是日期是否早于目标时间,并且我们相应地增加了一天。。如果两天之间的差异未给出预期结果,则使用第二个代码段。是这样吗?G