Java日期时间减法

问题描述 投票:0回答:2

String date1 =“ 2020/05/08 16.38.37”字符串date2 =“ 2020/04/08 20.18.10”

我希望减去带有完整date2的完整date1(包括日期和时间),并以小时为单位在java中获取结果。如何进行?

java datetime time formatter
2个回答
1
投票

知道在2个给定的时间戳之间有多少小时是不可能的,除非您告诉我要在地球上哪个位置进行数学运算。例如,如果您问我01:30到03:30之间的分钟,答案似乎是120,但是如果由于夏令时而恰好是将时钟向前移动一小时的夜晚,实际正确答案是60。

如果您从不希望进行这种调整,那么UTC不会受到像这样的怪异调整的困扰,因此您始终可以选择在UTC区域中进行数学运算。

因此,步骤:

  1. 将您的字符串(代表字符串,不包括任何时区信息,解析为“本地”日期/时间)放入LocalDateTime对象。
  2. 通过将这两个对象变成您所选区域中的ZonedDateTime对象来对其进行分区。
  3. 现在请API计算小时数和分钟数,两者之间您更喜欢。
  4. 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.time

首先,不要将日期和时间作为字符串保留在程序中。就像您不使用字符串来保存数字和布尔值一样(我希望如此),您也不应该使用日期和时间。使用现代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。


0
投票

java.time

© www.soinside.com 2019 - 2024. All rights reserved.