О GregorianCalendar: тот же ввод, но другой вывод в Java - PullRequest
1 голос
/ 13 января 2011

Я хочу использовать миллисекунды, чтобы установить новую дату в моей программе, но она не работает. Кто-нибудь может сказать мне, почему это не работает?

Календарь r_1 = новый GregorianCalendar (2011,0,1);

r_1.add (Calendar.DAY_OF_MONTH, 2);

System.out.println (r_1.getTime ());

long date_1 = r_1.getTimeInMillis () + 2 * 24 * 60 * 60 * 1000;

r_1.setTimeInMillis (startTime1);

System.out.println (r_1.getTime ());

Он работает очень корректно, но если я меняю день с 2 на 25, то он работает.

---------- вывод правильный, это 2011/01/26 ----------

Календарь r_1 = новый GregorianCalendar (2011,0,1);

r_1.add (Calendar.DAY_OF_MONTH, 25); * +1021 * * * 1 022 System.out.println (r_1.getTime ());

----------- сейчас вывод неправильный, это 2010/12/07 ------

long date_1 = r_1.getTimeInMillis () + 25 * 24 * 60 * 60 * 1000; // я изменил 2 на 25

* 1 028 * r_1.setTimeInMillis (startTime1); * +1029 *

System.out.println (r_1.getTime ()); * 1 031 *

Спасибо

Ответы [ 3 ]

3 голосов
/ 13 января 2011

Выражение 25*24*60*60*1000 является целым числом, и вы переполнили размер целого числа, создав отрицательное число.

Ваше выражение составляет 2 160 000 000 миллисекунд. Наибольшее значение, которое может хранить int, составляет 2 147 483 647.

Чтобы исправить это, вы должны заставить выражение быть длинным, как показано ниже

25L*24*60*60*1000
0 голосов
/ 13 января 2011

Попробуйте что-то подобное:

final long k = 25*24*60*60*1000L;
long date_1 = r_1.getTimeInMillis() + k;
0 голосов
/ 13 января 2011

25*24*60*60*1000 слишком велик, чтобы поместиться в int. Попробуйте 25L*24*60*60*1000, которая является длинной константой.

...