前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java 8计算两个日期之间的月份

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

作者头像
JavaEdge
发布于 2021-10-18 07:43:34
发布于 2021-10-18 07:43:34
6K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

开始日期:“2021-08-31” 结束日期:“2021-11-30”

在上述两个日期之间的91天持续时间,期望代码返回3个月的持续时间,但是以下方法仅返回2个月。这是Java 8中的bug 吗?日期为91天,却仅返回2个月。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Period diff = Period.between(LocalDate.parse("2021-08-31"),
    LocalDate.parse("2021-11-30"));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long daysBetween = ChronoUnit.MONTHS.between(LocalDate.parse("2021-08-31"),
    LocalDate.parse("2021-11-30"));

我尝试使用Joda库而不是Java 8 API,它可以工作。它会返回3,看起来Java持续时间的月份计算也使用了天数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDate dateBefore= LocalDate.parse("2016-08-31");
    LocalDate dateAfter = LocalDate.parse("2016-11-30");
    int months = Months.monthsBetween(dateBefore, dateAfter).getMonths();
    System.out.println(months);

但我就想用 JDK 的 API。因此仍在寻找其他解决方案。

由于仅需要两个日期之间的月份数,请使用期间的文档来调整日期,如Jacob所述使用日期。只需将两个实例的日期设置为相同的值(每月的第一天)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Period diff = Period.between(
            LocalDate.parse("2021-08-31").withDayOfMonth(1),
            LocalDate.parse("2021-11-30").withDayOfMonth(1));
System.out.println(diff); //P3M

与其他解决方案相同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long monthsBetween = ChronoUnit.MONTHS.between(
        LocalDate.parse("2021-08-31").withDayOfMonth(1),
        LocalDate.parse("2021-11-30").withDayOfMonth(1));
System.out.println(monthsBetween); //3

Period#between的文档指出以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The start date is included, but the end date is not.

此外:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A month is considered if the end day-of-month is greater than or equal to the start day-of-month.

你的月底结束日期30不大于或等于您的月底开始日期31,因此不考虑第三个月。

注意参数名称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static Period between?(LocalDate startDateInclusive, LocalDate endDateExclusive)

要返回3个月,您可以将endDateExclusive增加一天。 因此,最好调整实施方式,使结束日期包括在内并获得所需的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Period diff = Period.between(LocalDate.parse("2016-08-31"),
                LocalDate.parse("2016-11-30").plusDays(1));
System.out.println("Months :" + diff.getMonths());
//Output -> Months : 3

向后兼容较旧的JDK 版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int monthsBetween(Date d1, Date d2){
    if(d2==null || d1==null){
        return -1;//Error
    }
    Calendar m_calendar=Calendar.getInstance()
    m_calendar.setTime(d1);
    int nMonth1=12*m_calendar.get(Calendar.YEAR)+m_calendar.get(Calendar.MONTH);
    m_calendar.setTime(d2);
    int nMonth2=12*m_calendar.get(Calendar.YEAR)+m_calendar.get(Calendar.MONTH);
    return java.lang.Math.abs(nMonth2-nMonth1);
}

永远不要使用LocalDateTime来计算两个日期之间的月份,结果奇怪且不正确,请始终使用LocalDate!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class TestMonthsDateTime {
    public static void main(String[] args) {
        /**------------------Date Time----------------------------*/
        LocalDateTime t1 = LocalDateTime.now();
        LocalDateTime t2 = LocalDateTime.now().minusMonths(3);
        long dateTimeDiff = ChronoUnit.MONTHS.between(t2, t1);  
        System.out.println("diff dateTime :" + dateTimeDiff); //diff dateTime : 2
        /**-------------------------Date----------------------------*/
        LocalDate t3 = LocalDate.now();
        LocalDate t4 = LocalDate.now().minusMonths(3);
        long dateDiff = ChronoUnit.MONTHS.between(t4, t3);
        System.out.println("diff date :"  +  dateDiff);//diff date : 3
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static long durationMonths(LocalDate dateBefore, LocalDate dateAfter) {
        System.out.println(dateBefore+"  "+dateAfter);
        if (dateBefore.getDayOfMonth() > 28) {
            dateBefore = dateBefore.minusDays(5);
        } else if (dateAfter.getDayOfMonth() > 28) {
            dateAfter = dateAfter.minusDays(5);
        }
        return ChronoUnit.MONTHS.between(dateBefore, dateAfter);
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 8 时间和日期 API
除了调用LocalDate的getYear方法外,我们也可以使用ChronoField枚举类型来实现相同的功能:
码哥字节
2021/07/27
7480
Dating Java8系列之新的日期和时间
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因和未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。这意味着,如果你想要用Date表示Java 8的发布日期,即2014年3月18日,需要创建下面这样的Date实例:
翎野君
2024/01/05
1660
Dating Java8系列之新的日期和时间
Java8中使用以下类计算日期时间差:Period、Duration、ChronoUnit
ChronoUnit类可用于在单个时间单位内测量一段时间,例如天数或秒。 以下是使用between()方法来查找两个日期之间的区别的示例。
allsmallpig
2021/02/25
1.6K0
“干掉” Date,Java8 LocalDate 简直不能贼香,赶紧来艿一口~
伴随 lambda表达式、streams 以及一系列小优化,Java 8 推出了全新的日期时间API。
芋道源码
2020/06/04
2.2K0
Java 8 Time Api 使用指南-珍藏限量版
Java 8为Date和Time引入了新的API,以解决旧java.util.Date和java.util.Calendar的缺点。
码农小胖哥
2019/12/05
1.4K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
4.7K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
还在使用“SimpleDateFormat”,工资低怨不了别人!!!
静态工厂方法of创建一个LocalDate实例。LocalDate实例提供了多种方法来读取常用的值,比如年份、月份、星期几等,如下所示。
用户2242639
2021/06/29
2700
Java日期问题汇总
通常格式化日期时,都是使用的YYYY/MM/dd来格式化日期,但是在遇到跨年日期时,就会遇到很神奇的现象,如下:
雨临Lewis
2022/01/12
1.5K0
Java日期处理:格式化、算相差天数、处理日期区间、获当前时间
Java 开发中,日期和时间操作重要。本文剖析 Java 日期处理技巧,如格式化、算天数差、处理区间及用 Calendar 获当前时间。有代码示例解析,助开发者掌握技能并在项目中运用。
Yeats_Liao
2025/01/01
1480
Java日期处理:格式化、算相差天数、处理日期区间、获当前时间
Java 8 日期时间 API
java 8 通过发布新的Date-Time API (JSR 310)来进一步加强对日期和时间的处理。
一滴水的眼泪
2020/09/21
1.1K0
JAVA中计算两个日期时间的差值竟然也有这么多门道
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看。题目很简单:
是Vzn呀
2022/07/14
6.5K0
JAVA中计算两个日期时间的差值竟然也有这么多门道
超实用的18个Java8日期处理实践!
Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。
Bug开发工程师
2020/02/14
8000
Java8中日期的特性,别再用Date来处理日期啦~
01. 获取当前日期 格式:yyyy-MM-dd LocalDate today = LocalDate.now(); System.out.println("今天的日期:" + today); 02. 获取日期中的年/月/日 getMonthValue() 获取月 getDayOfMonth() 获取天 LocalDate today = LocalDate.now(); int year = today.getYear(); System.out.println("年:" + year);
笑凡尘
2020/07/31
1.8K0
Java8新特性时间日期库DateTime API及示例
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序新视界
2019/10/22
1.2K0
Java8新特性之日期处理
伴随 lambda表达式、streams 以及一系列小优化,Java 8 推出了全新的日期时间API。
二哥聊运营工具
2021/12/17
1.3K0
Java8新特性之日期处理
Java8新特性:新的时间和日期类库
Java 8另一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。
我的小碗汤
2019/07/30
1.7K0
让你快速了解LocalDate类的基本用法
LocalDate是带有年,月,日的日期。为了构建LocalDate对象,可以使用now或of静态方法栗子如下:
爱敲代码的猫
2019/10/16
1.5K0
JAVA8实战 - 日期API
这一节我们来讲讲JAVA8的日期类,源代码的作者其实就是Joda-Time,所以可以看到很多代码的API和Joda类比较像。日期类一直是一个比较难用的东西,但是JAVA8给日期类提供了一套新的API让日期类更加好用。
阿东
2021/08/16
1.6K0
JDK8的日期时间操作
查询当前日期(年月日)LocalDate localDate = LocalDate.now();System.out.println(localDate);//2021-11-18查询当前时间(时分秒)LocalTime localTime = LocalTime.now();String format = localTime.format(DateTimeFormatter.ofPattern("HH🇲🇲ss"));System.out.println(localTime.getHour()+":"+l
在下是首席架构师
2022/08/18
9300
如何使用Java计算两个日期之间的天数
在Java中,可以通过多种方式计算两个日期之间的天数。以下将从使用Java 8的日期和时间API、使用Calendar类和使用Date类这三个角度进行详细介绍。
很酷的站长
2023/09/24
5.2K0
如何使用Java计算两个日期之间的天数
推荐阅读
相关推荐
Java 8 时间和日期 API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验