我是靠谱客的博主 细心月光,最近开发中收集的这篇文章主要介绍java months between,关于java:Joda时间 – 两个日期之间的月份差异,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本问题已经有最佳答案,请猛点这里访问。

我需要得到两个日期之间的月差异,我使用的是Joda Time,问题是:

DateTime date1 = new DateTime().withDate(2015, 2, 1);

DateTime date2 = new DateTime().withDate(2015, 1, 1);

Months m = Months.monthsBetween(date1, date2);

int monthDif = m.getMonths();//this return 0

它返回0是因为这两个日期中间没有月份,所以我需要返回月份之间的差额而不是几个月之间的差额,如果日期相同,则添加1会有问题。

虽然上面的问题是关于天的,但和你的问题非常相似,解决方法也是一样的,叫DateTime#toLocalDate()把LocalDate传给Months#monthsBetween而不是DateTime。

你为什么一开始使用new Datetime().withDate()?它创建当前时刻的日期时间实例,然后更改它(保留时间字段不变)。如果您只想创建一个没有时间的新的特定日期,那么只需使用localdate,然后Months.monthsBetween(date1, date2)就可以了。

将第一个日期更改为2015-02-02,Joda正确返回1个月:

DateTime date1 = new DateTime().withDate(2015, 2, 2);

DateTime date2 = new DateTime().withDate(2015, 1, 1);

System.out.println(Months.monthsBetween(date2, date1).getMonths());

// Returns 1.

所以我的猜测是,由于你没有提供时间部分,Joda无法准确地确定2015-01-01 date2所指的时间点。你可能已经提到了23:59:59,在这种情况下,从技术上讲,一个完整的月还不会过去。

如果显式地提供零时间部分,它将按您最初预期的方式工作:

DateTime date1 = new DateTime().withDate(2015, 2, 1).withTime(0, 0, 0, 0);

DateTime date2 = new DateTime().withDate(2015, 1, 1).withTime(0, 0, 0, 0);

System.out.println(Months.monthsBetween(date2, date1).getMonths());

// Returns 1.

因此,我建议您在每个日期中明确指定00:00:00时间部分。

只是一个细节,datetime具有timeAtStartOfDay()方法

虽然其他答案是正确的,但它们仍然掩盖了真正的问题。

it returns 0 because there is no month in the middle of the two dates

不。它返回0,因为datetime对象有时间部分。创建两个时间间隔的DateTime,用当前时间(小时、分钟、秒和毫秒)填充,然后修改日期部分。如果你只想比较两个日期,就没有理由这么做。改为使用localdate。

LocalDate date1 = new LocalDate(2015, 2, 1);

LocalDate date2 = new LocalDate(2015, 1, 1);

Months m = Months.monthsBetween(date1, date2);

int monthDif = Math.abs(m.getMonths());//this return 1

还需要注意一个事实,即尽管几个月的文档对此一无所知,但如果第一个日期在第二个日期之后,Month可以包含负值。所以我们需要用Math.abs来计算两个日期之间的月数。

博士说:

Creates a Months representing the number of whole months between the two specified partial datetimes.

但事实并非如此。它真的计算了几个月的差额。不是月数。

是的,是我的错。实际返回-1,因为date1在date2之后。Months.monthsBetween文件从不说月份的周期可以是负数。:)但对于问题和接受的答案也是如此,不会改变任何东西。我把答案编辑成使用Math.abs。

我想最好向op(在答案中)解释为什么它用当前代码返回-1,并使用Months.monthsBetween(date2, date1);。它就像调用X.compareTo(Y)和Y.compareTo(X)一样,结果也会颠倒:d。

计算方法取决于要使用的业务逻辑。每个月的长度各不相同。一种选择是,在monthsBetween()函数中,获取date1和date2的月初,并进行比较。

类似:

DateTime firstOfMonthDate1 = new DateTime(date1.getYear(), date1.getMonthOfYear(), 1, 0, 0);

DateTime firstOfMonthDate2 = new DateTime(date2.getYear(), date2.getMonthOfYear(), 1, 0, 0);

Months m = Months.monthsBetween(firstOfMonthDate1, firstOfMonthDate2)

最后

以上就是细心月光为你收集整理的java months between,关于java:Joda时间 – 两个日期之间的月份差异的全部内容,希望文章能够帮你解决java months between,关于java:Joda时间 – 两个日期之间的月份差异所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部