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值之前,所有测试都是成功的。

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

  1. 【JAVA 第三章 流程控制语句】课后习题 计算两个日期之间的天数

    知识点: 1.绝对值 Math.abs() 的运用 2.str1.splist() 字符串分割方法的运用 3.字符串强转整形Integer.parseInt()的运用 public class Stu ...

  2. Day640.Java 8的日期时间类问题 -Java业务开发常见错误

    Java 8的日期时间类问题 Hi,阿昌来也! 今天记录分享的是Java 8的日期时间类问题 在 Java 8 之前,我们处理日期时间需求时,使用 Date.Calender 和 SimpleDate ...

  3. java中算两个时间内的秒数_java – Joda Time – 计算两个日期之间的秒数会引发异常....

    我使用以下代码来计算两个日期之间的秒数差异: long secondsBetween = (Seconds.secondsBetween(new LocalDate("1901-01-01& ...

  4. java 月份间隔_java计算两个日期之间相隔的月份(向下取整)

    最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...

  5. java 如何计算时间段_Java程序来计算两个时间段之间的时差

    Java程序来计算两个时间段之间的时差 在此程序中,您将学习计算Java中两个时间段之间的时差. 示例:计算两个时间段之间的时差 public class Time { int seconds; in ...

  6. java怎么计算相隔多少天_java计算两个日期之间相差天数和相隔天数详解

    大家看到文章标题"两个日期之间相差天数和相隔天数",是否有疑惑呢!从中文字面理解,"相差"和"相隔"是有区别的,然而就是这些区别害死很多人, ...

  7. java计算两个日期之间的天数(java计算两个日期之间的天数算法)

    两个日期之间的天数要怎么计算? 两个日期之间的天数的计算=日期相减+1.比如:六月一号到六月三号,这之间是3天,分别是:一号.二号.三号,算式:3-1+1=3(天).同理,2001年到2002年是2年 ...

  8. Java 8计算两个日期之间的月份

    开始日期:"2021-08-31" 结束日期:"2021-11-30" 在上述两个日期之间的91天持续时间,期望代码返回3个月的持续时间,但是以下方法仅返回2个 ...

  9. Java - 计算两个经纬度之间的直线距离

    Java - 计算两个经纬度之间的直线距离 代码Github地址 https://github.com/FrankZuozuo/JavaSpecial 1.点接口 public interface P ...

最新文章

  1. 用友公司Java面试题(含答案)
  2. 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则
  3. spring mvc绑定对象String转Date解决入参不能是Date的问题
  4. SSM:Cause: java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束的解决
  5. 143_Power BIPower Pivot月度、季度、半年度、全年同维度展示
  6. 云安全仍然是程序开发者头痛的问题
  7. 使用拼凑URL的方法,实现DotNetNuke在新窗口中打开内容(三)
  8. devexpress 高分辨率显示问题_144Hz高刷+曲屏超2k 蚂蚁电竞显示器ANT271QC 小白到专业电竞跳板...
  9. word表头宽行重复
  10. x2检验(chi-square test)或称卡方检验
  11. STM32中使用MMA7660重力加速度传感器
  12. android 实现男女按钮选择
  13. 添加IIS FTP站点密码
  14. spring boot 整合 elasticsearch 创建索引库 映射
  15. outlook html 图片,Outlook邮件内容中的图片无法显示 图片
  16. 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
  17. Ubuntu 22.04下安装配置rime五笔输入法
  18. Spring MVC 详解
  19. Mac下cmake使用
  20. excel文件无法打印提示内存不足_Mac应用程序无法打开提示不明开发者或文件损坏的处理方法

热门文章

  1. 清华大学2017届本科毕业典礼演讲——做有思想的行者
  2. 运营商大数据有哪些好处
  3. 机器学习及算法-python
  4. HTTP协议的请求协议(个人笔记看不懂的地方可以和我交流)
  5. 一个人形图案程序c语言,如何用PPT绘制出人形图形
  6. winform前后端框架_ABP开发框架前后端开发系列(1)框架的总体介绍
  7. java中两种遍历集合的方式_Java中Map集合的两种遍历方式
  8. java的语法基础_JAVA语法基础1(入门手册)
  9. python语句命令的概念_Python学习笔记1-基础概念
  10. 因果推断与反事实预测——盒马KDD2021的一篇论文(二十三)