java 比较2个时间大小写_date - Java 8:计算两个LocalDateTime之间的差异

Tapas Bose代码和Thomas代码存在一些问题。 如果时间差异为负,则数组获得负值。 例如,如果

LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 46, 45);

LocalDateTime fromDateTime = LocalDateTime.of(2014, 9, 9, 7, 46, 45);

它返回0年0个月1天-1小时0分0秒。

我认为正确的输出是:0年0个月0天23小时0分0秒。

我建议在LocalDate和LocalTime实例上分离LocalDateTime实例。 之后,我们可以获得Java 8 Period和Duration实例。 持续时间实例按天数和全天时间值(<24h)分开,随后校正周期值。 当第二个LocalTime值在firstLocalTime值之前时,有必要减少一天的时间。

这是我计算LocalDateTime差异的方法:

private void getChronoUnitForSecondAfterFirst(LocalDateTime firstLocalDateTime, LocalDateTime secondLocalDateTime, long[] chronoUnits) {

/*Separate LocaldateTime on LocalDate and LocalTime*/

LocalDate firstLocalDate = firstLocalDateTime.toLocalDate();

LocalTime firstLocalTime = firstLocalDateTime.toLocalTime();

LocalDate secondLocalDate = secondLocalDateTime.toLocalDate();

LocalTime secondLocalTime = secondLocalDateTime.toLocalTime();

/*Calculate the time difference*/

Duration duration = Duration.between(firstLocalDateTime, secondLocalDateTime);

long durationDays = duration.toDays();

Duration throughoutTheDayDuration = duration.minusDays(durationDays);

Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,

"Duration is: " + duration + " this is " + durationDays

+ " days and " + throughoutTheDayDuration + " time.");

Period period = Period.between(firstLocalDate, secondLocalDate);

/*Correct the date difference*/

if (secondLocalTime.isBefore(firstLocalTime)) {

period = period.minusDays(1);

Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,

"minus 1 day");

}

Logger.getLogger(PeriodDuration.class.getName()).log(Level.INFO,

"Period between " + firstLocalDateTime + " and "

+ secondLocalDateTime + " is: " + period + " and duration is: "

+ throughoutTheDayDuration

+ "\n-----------------------------------------------------------------");

/*Calculate chrono unit values and write it in array*/

chronoUnits[0] = period.getYears();

chronoUnits[1] = period.getMonths();

chronoUnits[2] = period.getDays();

chronoUnits[3] = throughoutTheDayDuration.toHours();

chronoUnits[4] = throughoutTheDayDuration.toMinutes() % 60;

chronoUnits[5] = throughoutTheDayDuration.getSeconds() % 60;

}

上述方法可用于计算任何本地日期和时间值的差异,例如:

public long[] getChronoUnits(String firstLocalDateTimeString, String secondLocalDateTimeString) {

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime firstLocalDateTime = LocalDateTime.parse(firstLocalDateTimeString, formatter);

LocalDateTime secondLocalDateTime = LocalDateTime.parse(secondLocalDateTimeString, formatter);

long[] chronoUnits = new long[6];

if (secondLocalDateTime.isAfter(firstLocalDateTime)) {

getChronoUnitForSecondAfterFirst(firstLocalDateTime, secondLocalDateTime, chronoUnits);

} else {

getChronoUnitForSecondAfterFirst(secondLocalDateTime, firstLocalDateTime, chronoUnits);

}

return chronoUnits;

}

为上述方法编写单元测试很方便(它们都是PeriodDuration类成员)。 这是代码:

@RunWith(Parameterized.class)

public class PeriodDurationTest {

private final String firstLocalDateTimeString;

private final String secondLocalDateTimeString;

private final long[] chronoUnits;

public PeriodDurationTest(String firstLocalDateTimeString, String secondLocalDateTimeString, long[] chronoUnits) {

this.firstLocalDateTimeString = firstLocalDateTimeString;

this.secondLocalDateTimeString = secondLocalDateTimeString;

this.chronoUnits = chronoUnits;

}

@Parameters

public static Collection periodValues() {

long[] chronoUnits0 = {0, 0, 0, 0, 0, 0};

long[] chronoUnits1 = {0, 0, 0, 1, 0, 0};

long[] chronoUnits2 = {0, 0, 0, 23, 0, 0};

long[] chronoUnits3 = {0, 0, 0, 1, 0, 0};

long[] chronoUnits4 = {0, 0, 0, 23, 0, 0};

long[] chronoUnits5 = {0, 0, 1, 23, 0, 0};

long[] chronoUnits6 = {29, 8, 24, 12, 0, 50};

long[] chronoUnits7 = {29, 8, 24, 12, 0, 50};

return Arrays.asList(new Object[][]{

{"2015-09-09 21:46:44", "2015-09-09 21:46:44", chronoUnits0},

{"2015-09-09 21:46:44", "2015-09-09 22:46:44", chronoUnits1},

{"2015-09-09 21:46:44", "2015-09-10 20:46:44", chronoUnits2},

{"2015-09-09 21:46:44", "2015-09-09 20:46:44", chronoUnits3},

{"2015-09-10 20:46:44", "2015-09-09 21:46:44", chronoUnits4},

{"2015-09-11 20:46:44", "2015-09-09 21:46:44", chronoUnits5},

{"1984-12-16 07:45:55", "2014-09-09 19:46:45", chronoUnits6},

{"2014-09-09 19:46:45", "1984-12-16 07:45:55", chronoUnits6}

});

}

@Test

public void testGetChronoUnits() {

PeriodDuration instance = new PeriodDuration();

long[] expResult = this.chronoUnits;

long[] result = instance.getChronoUnits(this.firstLocalDateTimeString, this.secondLocalDateTimeString);

assertArrayEquals(expResult, result);

}

}

无论第一个LocalDateTime的值是否在任何LocalTime值之前,所有测试都是成功的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用```java.util.Date```或```java.time.LocalDateTime```类来处理日期和时间。以下是使用```java.util.Date```类比较两个日期的示例代码: ```java import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CompareDateTimeExample { public static void main(String[] args) throws ParseException { DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateTime1 = format.parse("2022-01-01 12:00:00"); Date dateTime2 = format.parse("2022-01-01 13:00:00"); if (dateTime1.compareTo(dateTime2) < 0) { System.out.println("dateTime1 早于 dateTime2"); } else if (dateTime1.compareTo(dateTime2) > 0) { System.out.println("dateTime1 晚于 dateTime2"); } else { System.out.println("两个日期时间相等"); } } } ``` 在上面的示例代码中,我们首先定义了一个```SimpleDateFormat```对象来指定日期时间的格式,然后使用```parse```方法将字符串转换为```Date```对象。最后使用```compareTo```方法比较两个日期时间的大小。 如果使用```java.time.LocalDateTime```类,可以使用```isBefore```、```isAfter```、```isEqual```等方法来比较大小。以下是使用```java.time.LocalDateTime```类比较两个日期时间的示例代码: ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CompareDateTimeExample { public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime1 = LocalDateTime.parse("2022-01-01 12:00:00", formatter); LocalDateTime dateTime2 = LocalDateTime.parse("2022-01-01 13:00:00", formatter); if (dateTime1.isBefore(dateTime2)) { System.out.println("dateTime1 早于 dateTime2"); } else if (dateTime1.isAfter(dateTime2)) { System.out.println("dateTime1 晚于 dateTime2"); } else { System.out.println("两个日期时间相等"); } } } ``` 在上面的示例代码中,我们首先定义了一个```DateTimeFormatter```对象来指定日期时间的格式,然后使用```parse```方法将字符串转换为```LocalDateTime```对象。最后使用```isBefore```、```isAfter```、```isEqual```等方法比较两个日期时间的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值