java months between,java 8-chronounit.months.between(fromdate,todate)不能按预期工作

java months between,java 8-chronounit.months.between(fromdate,todate)不能按预期工作就日历而言,您的问题是可以理解的:这两个比较代表一个完整的月。但是java.time.temporal.ChronoUnit.between不是以这种方式推理,而是以成套设备.根据它的javadoc,结果是预期的:计算返回一个整数,表示两个时间单位之间的完整单位.例如,中的金额从11:30到13:29的时间只有一个小时一分钟差两个小时。这个LocalDate.untiljavadoc,由Chro…

大家好,又见面了,我是你们的朋友全栈君。

就日历而言,您的问题是可以理解的:这两个比较代表一个完整的月。

但是

java.time.temporal.ChronoUnit.between

不是以这种方式推理,而是以

成套设备

.

根据它的javadoc,结果是预期的:

计算返回一个整数,表示

两个时间单位之间的完整单位

. 例如,中的金额

从11:30到13:29的时间只有一个小时

一分钟差两个小时。

这个

LocalDate.until

javadoc,由

ChronoUnit.between()

对您的案例来说更为明确,并给出了一个有趣的例子

between()

用于

MONTHS

作为

TemporalUnit

:

计算返回一个整数,表示

两个日期之间的完整单位。例如,中的金额

2012年6月15日至2012年8月14日之间的月份仅为一个月

比两个月少一天。

在您的工作示例中:

LocalDate startDate=LocalDate.of(2018,01,31);

LocalDate endDate=LocalDate.of(2018,7,31);

long noOfMonths = MONTHS.between(startDate,endDate);

你有

31 days of month / 31 days of month, on 6 months

= & gt;

6 months

.

在你失败的例子中:

LocalDate startDate=LocalDate.of(2018,01,31);

LocalDate endDate=LocalDate.of(2018,6,30);

long noOfMonths = MONTHS.between(startDate,endDate);

你有

30 days of month / 31 days of month, on 5 months

= & gt;

4 months + 1 month short of 1 day

& =;

4 months

(四舍五入)

如果你想写这样的东西:

LocalDate startDate=LocalDate.of(2018,01,30);

LocalDate endDate=LocalDate.of(2018,6,30);

long noOfMonths = MONTHS.between(startDate,endDate);

你会的

30 days of month / 30 days of month, on 5 months

= & gt;

5 months

.

关于你的问题:

有别的办法吗?

最简单的方法是:将“月日”设置为

1

或者两个日期中的同一个数字。

如果不适合您的要求,您可以检查这两个日期是否是当前月份的最后一天,在这种情况下,将其设置为相同的月份值。

你可以写一些像:

int lastMonthStart = startDate.getMonth()

.length(startDate.isLeapYear());

int lastMonthEnd = endDate.getMonth()

.length(endDate.isLeapYear());

if (startDate.getDayOfMonth() == lastMonthStart && endDate.getDayOfMonth() == lastMonthEnd) {

startDate = startDate.withDayOfMonth(1);

endDate = endDate.withDayOfMonth(1);

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159762.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Git管理工具常用

    适用场景:通常我们到了新公司或者新的部门,一般会给你一个git的源码路径,如:http://ip:port/xxxx/xxx.git。这个时候我们需要拉取代码开发,则需要用到一些常用的工具!这里分享一下个人的经验。准备环境:1、下载两个工具(Git-2.16.2-64-bit.exe和TortoiseGit-1.8.14.0_64bit.1436148947),前者为本地…

    2022年4月1日
    38
  • Discuz搬家教程[通俗易懂]

    Discuz搬家教程[通俗易懂]第一步:备份网站数据进入后台—站长—数据库—备份,数据备份类型选择“Discuz!和UCenter数据”,备份成功以后,数据自动保存在data文件夹下。第二步:网站文件下载把整个网站文件打包(虚拟主机管理控制面板一般都有整站压缩和解压的功能,在控制面板选择压缩,压缩之后的文件一般在FTPDB文件夹里面,然后把压缩包下载到本地电脑,如果虚拟主机没有在线压缩功能那就直接使用FTP下载文件到本地保存。第三步:整理下载到本地的网站文件1.把下载下来的文件里面的下列文件删除,请完全放心删除掉这几个文件,

    2022年7月25日
    19
  • preparedStatement介绍

    preparedStatement介绍PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还

    2022年6月11日
    49
  • python中保留小数位数_python四舍五入保留两位小数

    python中保留小数位数_python四舍五入保留两位小数在这里插`在这里插入代码`在这里插入代码片`片`入代码片python保留小数位的方法?num=1.22334577901#保留两位小数print(‘{:.2f}’.format(num))print(‘%.2f’%num)print(round(num,2))

    2022年8月12日
    5
  • mysql将字符串转为数字

    mysql将字符串转为数字MySQL字符串+0即可转为数字:<!–查找版本是否满足区间–><selectid="isVersion"resultType="java.lang.String"parameterType="map">SELECTversion_idfromjob_release_versionwheresrc_ver…

    2022年5月29日
    39
  • pytest parametrize fixture_qtp参数化

    pytest parametrize fixture_qtp参数化前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月30日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号