java.time中,月份相加的结果是如何计算的?

2024-04-21

在 JSR-310 中java.timeJDK 8中的API,日期加月份结果的计算规则是什么。特别是,当您向 1 月 31 日这样的日期添加 1 个月时会发生什么?

LocalDate initial = LocalDate.of(2012, 1, 31);  // 31st January 2012
LocalDate result = initial.plusMonths(1);
// what is the result?

简短回答:

在示例中,结果将是二月的最后一天,2012-02-29.

解释:

“如果加上一个月,你会得到什么日期”这个问题是一个可以解释的问题。为了避免这种情况,java.timeAPI 有一个明确的规则 https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#plusMonths-long-。结果将与输入的日期相同,除非该日期是无效日期,在这种情况下,结果是该月的最后一天。

因此,1 月 31 日加一个月将得到 2 月 31 日,但由于这是一个无效日期,因此结果是 2 月的最后一个有效日期,即 2 月 28 日或 2 月 29 日,具体取决于是否是闰年:

// normal case
2011-01-15 plus 1 month = 2011-02-15  // 15 Jan -> 15 Feb

// special rule choosing the last valid day-of-month
2011-01-31 plus 1 month = 2011-02-28  // 31 Jan -> 28 Feb (2011 is normal year)
2012-01-31 plus 1 month = 2012-02-29  // 31 Jan -> 29 Feb (2012 is leap year)

// same rule applies for months other than February
2013-03-31 plus 1 month = 2013-04-30  // 31 Mar -> 30 Apr (only 30 days in April)

无论添加一个月还是多个月份,都适用相同的规则,并且始终基于结果月份。 IE。首先添加月份(如有必要,调整年份),然后才考虑月份中的日期。减法时也适用同样的规则。

// multiple months works on the month of the result
2013-10-31 plus 4 months = 2014-02-28   // last day of February
2013-10-31 minus 4 months = 2013-06-30  // last day of June

在日期中添加/减去年份时也适用相同的规则 - 添加年份,然后才检查月份中的日期是否在该月内有效。

// years use the same rule
2012-02-29 plus 1 year = 2013-02-28  // 29th February invalid so adjusted to 28th

如果您的业务逻辑需要不同的月份添加规则,最好的方法是编写一个TemporalAdjuster or TemporalAmount打包你的特殊逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.time中,月份相加的结果是如何计算的? 的相关文章

随机推荐

  • 如何修复这个损坏文件的 PHP 下载脚本?

    我有一个强制下载脚本 可以在 PDF 和纯文本中产生良好的结果 并且在 ZIP 存档中半正常 它们在 Windows 中工作 而不是在 Linux 中工作 但是 应用程序文件和图像都失败 这些构成了我必须处理的绝大多数文件 正如我在此处看到
  • Django ORM 能否以与后端无关的可靠方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

    我见过的所有文档都暗示你might能够做到这一点 但没有任何官方 w r t ulong64 uint64 字段 在这个领域有一些现成的选项看起来很有前途 BigIntegerField 几乎 但签名 PositiveIntegerFiel
  • Bootstrap4使卡头高度相同

    以 Bootstrap 4 的定价模板为例 假设我有不同文本长度的卡片标题 因此在某些屏幕分辨率下 卡片标题的高度会变得不同 我想确保它们始终具有相同的高度 div class container div class card deck m
  • ERROR 发送和传输仅适用于应付地址类型的对象,不适用于地址

    function finalizeRequest uint index public restricted Request storage request requests index require request approvalCou
  • HTML/ CSS:A href 超出链接图像 - 如何避免?

    我将三个 HTML 元素排成一行使用内联块 https stackoverflow com questions 13290085 basic html place images in one row with same distance f
  • php的password_hash和password_verify看了一遍还是不行

    UPDATE所以这是一个令人尴尬的愚蠢承认 但问题是我存储在数据库中的哈希值是 密码 的哈希值包括引号 我写的查询没有问题 问题出在椅子和键盘之间 所以这是一个经常被问到的问题 我查遍了 stackoverflow 和 google 试图找
  • Delphi - 检测我的应用程序是否打开了模式对话框

    我有一个 Delphi 2006 应用程序 当检测到错误情况时 它会弹出模式警报对话框 由于对错误条件的检查是在空闲处理程序中完成的 因此如果恰好显示了另一个模式对话框 则该对话框可能会在另一个模式对话框的顶部弹出 这可能会导致用户感到困惑
  • 从 PostgreSQL 数据库检索评论

    我正在 Postgres 数据库上运行一个项目 需要检索数据库中列的注释以用作表标题等 我已经看到有几个内置函数 pg 描述 http www postgresql org docs 9 1 static catalog pg descri
  • ruby/rails:扩展或包含其他模块

    我将模块分开 以便它们更易于阅读和搜索 lib features running rb walking rb features rb 他们有 lib features running rb module Features Running e
  • 奇怪的Java时区日期转换问题

    我想转换ms since 1970 timestamp到带有时区的日期 德国 这里有两种有效的代码变体 至少 我记得使用过它并且它有效 import java text SimpleDateFormat import java util C
  • jQuery异步函数调用,无AJAX请求

    这看起来很愚蠢 但我找不到如何使用 jQuery 进行不涉及某些服务器端请求的异步函数调用 我有一个缓慢的函数 它会遍历大量 DOM 元素 并且我希望浏览器在该函数运行时不会冻结 我想在调用慢速函数之前显示一个小指示器 然后当慢速函数返回时
  • excel+powerpoint 如何决定重新缩放粘贴为图像的范围?

    我注意到 当您复制 Excel 中的范围 复制为图片 如屏幕所示 并将其粘贴到 PowerPoint 中时 生成的图像不会 100 缩放为原始图像 右键单击图像 转到格式设置并转到尺寸以查看比例信息 此外 这种缩放比例在不同的计算机上有所不
  • 如何使用 C API 创建 datetime64 对象的 Numpy 数组?

    我需要从 C C 代码创建 numpy datetime64 对象的数组 正如你所看到的NPY LONGLONG and NPY VOID我做到了 我需要做同样的事情NPY DATETIME type PyObject arr1 PyArr
  • 在 Javascript/jQuery 中从数组中删除多个元素

    我有两个数组 第一个数组包含一些值 而第二个数组包含应从第一个数组中删除的值的索引 例如 var valuesArr new Array v1 v2 v3 v4 v5 var removeValFromIndex new Array 0 2
  • 从头开始一个 TDD 项目

    我读了很多关于 TDD 的问答和关于 SO 的单元测试 但我没有找到任何答案 我从哪里开始 我和团队已经完成了几个项目 在这些项目中 我们对代码采用了单元测试 但先编码 然后单元测试 在开发过程的某个阶段 先编写测试然后编写代码变得很自然
  • Manatee.Trello 移动卡片

    我正在编写一个小型应用程序来管理 Trello Boards 的几个方面 例如对列表中的卡片进行排序 根据截止日期和 或标签移动 复制卡片 定期归档列表以及根据标签生成报告 因此 我一直在 Manatee Trello 库周围构建一个外观
  • Picasso 加载 AsyncTask 内生成的图像

    所以我正在尝试使用毕加索图书馆 http square github io picasso 用于图像下载和缓存 为了让 contactUri 传递给Picasso我需要向联系人查询Content Provider 由于我不想阻止主 UI 线
  • ETL 工具...它们到底做什么?请通俗地说[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我最近接触了一些 ETL 工具 例如 Talend 和 Apatar 我想知道这些工具通俗地说的用途 主要目标到底是什么 谁主要使用它
  • UICollectionView 断言失败

    我在执行时遇到此错误insertItemsAtIndexPaths in UICollectionView 断言失败 UICollectionViewData indexPathForItemAtGlobalIndex SourceCach
  • java.time中,月份相加的结果是如何计算的?

    在 JSR 310 中java timeJDK 8中的API 日期加月份结果的计算规则是什么 特别是 当您向 1 月 31 日这样的日期添加 1 个月时会发生什么 LocalDate initial LocalDate of 2012 1