• org.joda.time.datetime.plusMonths 添加月数,缺少天数。


    我尝试使用 java DateTime和方法 plusMonths()从给定的开始日期添加完整的月份. 

    当我的开始时间是在一个月的开始时,一切都像预期的那样工作:

    DateTime startOfMonth = new DateTime(2013, 1, 1, 00, 00, 00);
        System.out.println(startOfMonth.toString());
        for (int i = 0; i < 12; i++) {
            startOfMonth = startOfMonth.plusMonths(1);
            System.out.println(startOfMonth.toString());
    }
    

      

    输出是每个月的第一天,就像预期的一样,一切都很棒!

    2013-01-01T00:00:00.000+01:00
    2013-02-01T00:00:00.000+01:00
    2013-03-01T00:00:00.000+01:00
    2013-04-01T00:00:00.000+02:00
    2013-05-01T00:00:00.000+02:00
    2013-06-01T00:00:00.000+02:00
    2013-07-01T00:00:00.000+02:00
    2013-08-01T00:00:00.000+02:00
    2013-09-01T00:00:00.000+02:00
    2013-10-01T00:00:00.000+02:00
    2013-11-01T00:00:00.000+01:00
    2013-12-01T00:00:00.000+01:00
    2014-01-01T00:00:00.000+01:00
    

      

    但是,当我将我的例子改为月末时,它不会返回我想要的东西!

    System.out.println("");
    DateTime endOfMonth = new DateTime(2012, 12, 31, 23, 59, 59);
    System.out.println(endOfMonth.toString());
    for (int i = 0; i < 12; i++) {
        endOfMonth = endOfMonth.plusMonths(1);
        System.out.println(endOfMonth.toString());
    }
    

      

    返回:问题来了

    2012-12-31T23:59:59.000+01:00
    2013-01-31T23:59:59.000+01:00
    2013-02-28T23:59:59.000+01:00
    2013-03-28T23:59:59.000+01:00
    2013-04-28T23:59:59.000+02:00
    2013-05-28T23:59:59.000+02:00
    2013-06-28T23:59:59.000+02:00
    2013-07-28T23:59:59.000+02:00
    2013-08-28T23:59:59.000+02:00
    2013-09-28T23:59:59.000+02:00
    2013-10-28T23:59:59.000+01:00
    2013-11-28T23:59:59.000+01:00
    2013-12-28T23:59:59.000+01:00
    

      

    日期操作的问题是月份具有不同的天数.在1月份,你有31天,2月只有28天.如果你将“一个月”添加到1月31日,软件无法猜出你想要达到的目标,所以它会增加月份的增量,这将给你2月31日 – 无效.然后,下一步是调和产生这些奇怪结果的日期.

    注意:在原始的Java Date类中,在1月份添加一个月之后你会得到3月2日或3日,这不是更好:-)

    迭代月末的正确方法是迭代当月的第一天并减去一天(或一毫秒):

    DateTime startOfMonth = new DateTime(2013, 1, 1, 00, 00, 00);
    System.out.println(startOfMonth.toString());
    for (int i = 0; i < 12; i++) {
        startOfMonth = startOfMonth.plusMonths(1);
        DateTime endOfMonth = startOfMonth.minusDays(1); // magic here
        System.out.println(startOfMonth + "-" + endOfMonth);
    }
    

      

    或者,定义一常量:

    1月=31天,2=28天,3月=31天.......
    假如当前月份是2月需要+1个月,获取3月份的天数31天,2月份+31天数;

  • 相关阅读:
    webpack + vue 打包生成公共配置文件(域名) 方便动态修改
    前端实用工具大集合
    Javascript高级程序设计--读书笔记之理解原型对象
    Javascript高级程序设计--读书笔记之面向对象(二)
    Javascript高级程序设计--读书笔记之面向对象(一)
    Javascript高级程序设计--读书笔记之Array类型
    javascript 中的函数
    CF1037H Security (SAM+二维偏序)
    搜索和组合数学P1246 编码
    模拟画图题P1185 绘制二叉树
  • 原文地址:https://www.cnblogs.com/achengmu/p/13030065.html
Copyright © 2020-2023  润新知