Java中Calendar跨年的坑「建议收藏」

Java中Calendar跨年的坑「建议收藏」上代码:publicstaticvoidmain(String[]args)throwsException{SimpleDateFormatsimpleDateFormat=newSimpleDateFormat(“yyyy-MM”);Calendarcalendar=Calendar.getInstance();calendar.setTime(simpleDateFormat.parse(“2021-08”)

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

上代码:

    public static void main(String[] args) throws Exception{ 
   

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(simpleDateFormat.parse("2021-08"));

        calendar.roll(Calendar.MONTH, -5);

        String date = simpleDateFormat.format(calendar.getTime());

        System.out.println("-------------" + date + "-------------");
    }

运行结果

-------------2021-03-------------

可以看到,减去5个月得到的日期是没有问题的,但是减去超过一年时就有问题了,再试试减20个月

    public static void main(String[] args) throws Exception{ 
   

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(simpleDateFormat.parse("2021-08"));

        calendar.roll(Calendar.MONTH, -20);

        String date = simpleDateFormat.format(calendar.getTime());
        
        System.out.println("-------------" + date + "-------------");
    }

运行结果

-------------2021-12-------------

日期不对了,正确日期应该是:2019-12

解决办法:将roll方法换成add,roll方法只能在当前年进行计算,add方法可以进行跨年计算

    public static void main(String[] args) throws Exception { 
   

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(simpleDateFormat.parse("2021-08"));

        calendar.add(Calendar.MONTH, -20);

        String date = simpleDateFormat.format(calendar.getTime());

        System.out.println("-------------" + date + "-------------");
    }

运行结果

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

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

(0)
上一篇 2022年6月14日 下午4:16
下一篇 2022年6月14日 下午4:36


相关推荐

  • 第十六届全国大学生智能车竞赛华东赛区_第十五届全国大学生智能汽车竞赛

    第十六届全国大学生智能车竞赛华东赛区_第十五届全国大学生智能汽车竞赛第十七届全国大学生智能车竞赛华南赛区奖项

    2022年9月30日
    5
  • C++读写锁介绍_数据库读写锁

    C++读写锁介绍_数据库读写锁一点睛先看看互斥锁,它只有两个状态,要么是加锁状态,要么是不加锁状态。假如现在一个线程a只是想读一个共享变量i,因为不确定是否会有线程去写它,所以我们还是要对它进行加锁。但是这时又有一个线程b试图去读共享变量i,发现被锁定了,那么b不得不等到a释放了锁后才能获得锁并读取i的值,但是两个读取操作即使是同时发生的,也并不会像写操作那样造成竞争,因为它们不修改变量的值。所以我们期望在多个线…

    2022年8月12日
    9
  • 影视3D建模和游戏3D建模差异,哪个更有前景?

    影视3D建模和游戏3D建模差异,哪个更有前景?影视3D建模和游戏3D建模,两者之间最大和最明显的差异是:游戏开发永远有多边形建模预算。影视建模方面,对于多边形数量都没有限制。对于电影来说,唯一限制是时间,按时,按预算生产合格的模型。游戏建模设计不能随意增加多边形面数,必须依靠纹理细节提升模型的质量。由于多边形数量必须很低,需要其他方法将更多细节放入模型中,目前最好的方法当然是使用纹理。游戏建模设计技术游戏中经常使用的技术是细节层次。意味单个游戏会有几个不同的细节级别。玩家离模型越远,资产的细节就越少。随着玩家越来越近,较低分辨率模型将被.

    2022年5月19日
    59
  • Hunyuan MT1.5-1.8B实战进阶:多模态输入预处理部署教程

    Hunyuan MT1.5-1.8B实战进阶:多模态输入预处理部署教程

    2026年3月12日
    2
  • sparksql报错

    sparksql报错Exceptionint main org apache spark sql catalyst errors package TreeNodeExce execute tree Exchangehash subject 6 200 HashAggregat keys subject 6 name 7 functions count 1 output subject 6 name 7 c 12L E

    2025年8月30日
    4
  • 零基础成为黑客[通俗易懂]

    零基础成为黑客[通俗易懂]笔者刚乱入了CTF,算是入门了,此处分享一下入门经验一个漏洞练习平台:https://github.com/gh0stkey/DoraBox使用教程参考:https://www.cnblogs.com/zhaijiahui/p/10789251.html攻防世界:https://adworld.xctf.org.cn/task这个网站很良心,第一次点开这个网站,仿佛看到了新世界…

    2022年5月9日
    59

发表回复

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

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