如何在Java中移动日历?

时间:2014-06-19 21:50:24

标签: java datetime gregorian-calendar

我正在尝试使用以毫秒为单位的时间偏移来编写一个Java方法来移动Calendar。 但是,当我尝试换班一个月(30天)时,它不起作用:

Calendar c = new GregorianCalendar(2012, 5, 23, 13, 23, 10);
long original = c.getTimeInMillis();
System.out.println("Original Date "+c.getTime());

long oneMonth = 30*24*60*60*1000;   //one month in milliseconds
Calendar c_1Month = new GregorianCalendar();
c_1Month.setTimeInMillis(original+oneMonth);
System.out.println("After 1-month "+c_1Month.getTime());

输出

Original Date Sat Jun 23 13:23:10 PDT 2012
After 1-month Sun Jun 03 20:20:22 PDT 2012

你可以看到它没有正确地转移到7月23日。 我知道在日历中有一个特定的方法add(field,amount),我可以使用它来改变月份,但我想在我的客户端中使用一种方法来改变时间,提供以毫秒为单位的移位量(基于班次的变化量)在我的测试中,我不想有几种方法)。

2 个答案:

答案 0 :(得分:2)

您认为变量oneMonth是long,但您为其指定了一个整数值。但30*24*60*60*1000的结果不适合整数,因此溢出为负值。

如果您将代码更改为long oneMonth = 30*24*60*60*1000L;,则可以使用。

但是尽管你的代码中存在“bug”,但是azurefrog的comment是正确的,这不是推荐的添加一个月的方法,只有在你想添加30天的情况下它才有效。不同的东西。

尝试使用类似的东西:

c_1Month.add( Calendar.DAY_OF_MONTH, 30);

c_1Month.add( Calendar.MONTH, 1);

Calendar类知道并且能够非常好地处理所有极端情况。我建议你依靠这个。它减少了可能的错误,使代码更易于阅读和理解。

使用Java 8,使用的代码是:

LocalDateTime.now().plusMonths(1);

LocalDateTime.now().plusDays(30);

答案 1 :(得分:0)

添加" L"在30*24*60*60*1000

的末尾

你在计算的方式,你正在将整个事物转变为INTEGER。

不要相信我:),尝试在1000之后添加L之前打印该值;

    System.out.println(oneMonth);

您的最终代码应为:

    Calendar c = new GregorianCalendar(2012, 5, 23, 13, 23, 10);
    long original = c.getTimeInMillis();
    System.out.println("Original Date "+c.getTime());

    long oneMonth = 30*24*60*60*1000L;   //one month in milliseconds

    Calendar c_1Month = new GregorianCalendar();
    c_1Month.setTimeInMillis(original+oneMonth);
    System.out.println("After 1-month "+c_1Month.getTime());