String date1 =“ 2020/05/08 16.38.37”字符串date2 =“ 2020/04/08 20.18.10”
我希望减去带有完整date2的完整date1(包括日期和时间),并以小时为单位在java中获取结果。如何进行?
知道在2个给定的时间戳之间有多少小时是不可能的,除非您告诉我要在地球上哪个位置进行数学运算。例如,如果您问我01:30到03:30之间的分钟,答案似乎是120,但是如果由于夏令时而恰好是将时钟向前移动一小时的夜晚,实际正确答案是60。
如果您从不希望进行这种调整,那么UTC不会受到像这样的怪异调整的困扰,因此您始终可以选择在UTC区域中进行数学运算。
因此,步骤:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH.mm.ss");
ZoneId zone = ZoneId.of("Europe/Amsterdam");
LocalDateTime input1 = LocalDateTime.parse("2020/05/08 16.38.37", formatter);
LocalDateTime input2 = LocalDateTime.parse("2020/04/08 20.18.10", formatter);
ZonedDateTime zoned1 = input1.atZone(zone);
ZonedDateTime zoned2 = input2.atZone(zone);
Duration duration = Duration.between(zoned1, zoned2);
long hours = duration.toHours();
System.out.println(hours);
上面将打印-716(例如,如果您问居住在阿姆斯特丹的某人,则第一枚邮票至少要716个小时,少于717个小时,至少要在第二枚之前……)。
NB:如果您想谈论几周,几个月等-您想要Period
,而不是Duration
。
首先,不要将日期和时间作为字符串保留在程序中。就像您不使用字符串来保存数字和布尔值一样(我希望如此),您也不应该使用日期和时间。使用现代Java日期和时间API java.time中的正确日期和时间类型。
假设您的日期和时间在某个明确定义的时区中,建议对它们使用ZonedDateTime
。
ZoneId zone = ZoneId.of("America/Montreal"); ZonedDateTime dateTime1 = ZonedDateTime.of(2020, 5, 8, 16, 38, 37, 0, zone); ZonedDateTime dateTime2 = ZonedDateTime.of(2020, 4, 8, 20, 18, 10, 0, zone);
发现差异是一线的:
long diffHours = ChronoUnit.HOURS.between(dateTime2, dateTime1); System.out.println("Difference in hours: " + diffHours);
此示例代码段的输出是:
Difference in hours: 716
[请在您要输入美国/蒙特利尔的位置插入您想要的时区。如果到夏令时(DST)或从夏令时(DST)的过渡介于两个日期之间,则选择不同的时区可能会使我们多花一个小时或更长时间。
如果您的日期和时间是字符串输入,那么您首先需要对它们进行解析。一个例子:
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH.mm.ss"); String string1 = "2020/05/08 16.38.37"; String string2 = "2020/04/08 20.18.10"; ZonedDateTime dateTime1 = LocalDateTime.parse(string1, inputFormatter).atZone(zone); ZonedDateTime dateTime2 = LocalDateTime.parse(string2, inputFormatter).atZone(zone); System.out.println("Date and time 1: " + dateTime1); System.out.println("Date and time 2: " + dateTime2);`
Date and time 1: 2020-05-08T16:38:37-04:00[America/Montreal] Date and time 2: 2020-04-08T20:18:10-04:00[America/Montreal]
链接
Oracle tutorial: Date Time解释如何使用java.time。