我正在寻找一个计算两个日期之间的月份的解决方案。我认为joda或java8时间可以做到。但是当我比较它们时,我发现了一些非常奇怪的东西。

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.time.LocalDateTime;

import java.time.ZoneId;

import java.time.temporal.ChronoUnit;

import java.util.Date;

import org.joda.time.Months;

public class DateMain {

public static void main(String[] args) throws ParseException {

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Date d1 = simpleDateFormat.parse("2017-01-28 00:00:00.000");

Date d2 = simpleDateFormat.parse("2017-02-28 00:00:00.000");

System.out.println("Test Cast 1");

System.out.println("joda time api result: " + monthsBetweenJoda(d1, d2) + " month");

System.out.println("java8 time api result: " + monthsBetweenJava8(d1, d2) + " month");

Date dd1 = simpleDateFormat.parse("2017-01-29 00:00:00.000");

Date dd2 = simpleDateFormat.parse("2017-02-28 00:00:00.000");

System.out.println("Test Cast 2");

System.out.println("joda time api result: " + monthsBetweenJoda(dd1, dd2) + " month");

System.out.println("java8 time api result: " + monthsBetweenJava8(dd1, dd2) + " month");

}

public static int monthsBetweenJoda(Date fromDate, Date toDate) {

if (fromDate == null || toDate == null) {

throw new IllegalArgumentException();

}

org.joda.time.LocalDateTime fromLocalDateTime = org.joda.time.LocalDateTime

.fromDateFields(fromDate);

org.joda.time.LocalDateTime toLocalDateTime = org.joda.time.LocalDateTime

.fromDateFields(toDate);

Months months = Months.monthsBetween(fromLocalDateTime, toLocalDateTime);

return months.getMonths();

}

public static long monthsBetweenJava8(Date fromDate, Date toDate) {

if (fromDate == null || toDate == null) {

throw new IllegalArgumentException();

}

LocalDateTime ldt1 = fromDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

LocalDateTime ldt2 = toDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

return ChronoUnit.MONTHS.between(ldt1, ldt2);

}

}

输出如下:

Test Cast 1

joda time api result: 1 month

java8 time api result: 1 month

Test Cast 2

joda time api result: 1 month

java8 time api result: 0 month

我对测试用例2感到非常困惑,哪一个合理?

对不起,这是我的第一个问题。已完成的代码已附加。

java8 joda_Joda Time和Java8时差相关推荐

  1. java8 joda_Joda Time项目和java8时间api

    Joda Time出现的背景 在java1.0中,对日期和时间的支持只能依赖java.util.Date类.正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间.更糟糕的是它的易用性,由于某 ...

  2. 【爱上Java8】BigInteger在Java8中的改进

    BigInteger在Java8里增加了一组方法: 1 2 3 public byte byteValueExact() public int intValueExact() public long  ...

  3. java8 stringbuilder_有了Java8的“+”真的可以不要StringBuilder了吗

    最近在头条上看到一篇帖子,说Java8开始,字符串拼接时,"+"会被编译成StringBuilder,所以,字符串的连接操作不用再考虑效率问题了,事实真的是这样吗?要搞明白,还是要 ...

  4. java8与hibernate_Hibernate 使用java8 LocalDateTime 注意事项

    大家都知道,以前我们时间都用java.util.Date类型,但是现在都已经过时了, Java8里面新出来了一些API,LocalDate.LocalTime.LocalDateTime 非常好用 实 ...

  5. java8 optional使用_[Java8]如何正确使用Optional

    Optional是Java8提供的为了解决null安全问题的一个API.善用Optional可以使我们代码中很多繁琐.丑陋的设计变得十分优雅.这篇文章是建立在你对Optional的用法有一定了解的基础 ...

  6. java8双层for循环,Java8处理List的双层循环问题

    Java处理List的双层循环程序员经常遇到,一般都是当两个List某个值满足某条件时候,进行相应的处理: 1.list和map之间的相互转换 /** * 两个List对象当id相同的时候(注意是两个 ...

  7. java8 wordcount_Spark2.x与Java8下WordCount示例

    spark深度学习指南+进阶实战2册 123.9元 包邮 (需用券) 去购买 > 不用 lambda 的基础版 import org.apache.spark.api.java.JavaPair ...

  8. java8 lambda 排序算法,Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)...

    在涉及到数组, 集合等这些地方经常会需要用到排序算法, 在Java中的Collections类中有sort方法, 除了需要传入一个Comparator比较器, 或者需要排序的类实现了Comparabl ...

  9. java8如何遍历list,java8 List和Map遍历

    java简化了foreach遍历.可以将list和mapzhuan转化为stream来操作 List items = new ArrayList<>(); items.add(" ...

最新文章

  1. Nginx与PHP(FastCGI)的安装、配置、优化
  2. java中使用什么来做错误处理_JAVA基础--如何通过异常处理错误
  3. 龙的建模竟然能建成这个样子:向大佬低头
  4. 注入安卓进程,并hook java世界的方法
  5. 《编译原理》实验预习报告——基于YACC的TINY语法分析器的构建
  6. 患者是否应该主动关注医疗知识
  7. 答应我不要问TCP三次握手四次挥手
  8. unity之中级工程师
  9. 3个观念 不再瞎学习!
  10. 实战 | 对抗外部威胁防护和勒索病毒,大厂怎么做?
  11. securecrt遇到一个致命的错误且必须关闭_淄博plc维修西门子plcs7-200致命错误7强制数据永久存储区错误...
  12. 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法
  13. 微信读书vscode插件_众所周知,拥有了vscode就拥有了一切
  14. co2激光切割机控制系统上位机C#源码,stm32f407控制板源码,可用于雕刻机,切割机,写字机,点胶机
  15. 项目管理:RASCI模型
  16. RestSharp是什么?
  17. 软件升级 防火墙 飞塔_FortiGate软件版本升级
  18. stm32 SWD printf SWD调试输出
  19. 网盘中html怎么转成视频,怎么将百度网盘保存的MKV转换MP4格式
  20. scara机器人dh参数表_scara机器人技术参数

热门文章

  1. 支持OnVif协议的摄像头直播推流php
  2. 启用php client,RabbitMQ(二):安装 和 PHP Client
  3. 制程与良率,谁才是芯片厂商的竞赛底牌?
  4. Appium元素定位操作app
  5. 手机配指环条码阅读器的爱恨纠缠
  6. 恭喜谷歌迈出抗议大猪蹄子第一步
  7. 蚂蚁金服 花呗借呗 招聘公告
  8. too many open files in system报错处理方案
  9. PowerMill 2018三五轴编程+后处理制作视频教程
  10. Luat实现uart串口通信