在java中如何在日期和时间之间切换

在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

我需要指定时间内的日期

例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.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,但我认为它是相似的。然后你可以在currDay0days)。不确定如何修复
即时
,可能已经修复了
LocalDat
我正在努力理解,如果我错了,请纠正我。。我们使用的第一个代码片段是日期是否早于目标时间,并且我们相应地增加了一天。。如果两天之间的差异未给出预期结果,则使用第二个代码段。是这样吗?很高兴你能解释第一个代码段第一个代码段工作得很有魅力,有各种输入,我得到了预期的输出。谢谢@MadProgrammer。但当前实例的第二个代码段是8:40,使用9小时前的代码段将输出作为今天的日期。理想情况下,它应该给我今天和昨天,我得到的第一个SwitpPt可能是一个问题,日光节约的时间实例或LoalDaltTimeTimes考虑我的本地机器时区,对吗?或者通常是UTC?部分问题是,-9小时在技术上不是“天”差(返回
0
days)。不确定如何修复
即时
,可能已经修复了
LocalDat
我正在努力理解,如果我错了,请纠正我。。我们使用的第一个代码片段是日期是否早于目标时间,并且我们相应地增加了一天。。如果两天之间的差异未给出预期结果,则使用第二个代码段。是这样吗?G