我正在尝试使用以毫秒为单位的时间偏移来编写一个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),我可以使用它来改变月份,但我想在我的客户端中使用一种方法来改变时间,提供以毫秒为单位的移位量(基于班次的变化量)在我的测试中,我不想有几种方法)。
答案 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());