Что происходит с Java-классом Date? Это известная ошибка? - PullRequest
5 голосов
/ 11 июня 2009

Я знаю, Date в основном устарела, но я все еще использую его время от времени (меньше кода, чем при использовании Calendar). Я наткнулся на действительно странную ошибку, и мне интересно, может ли кто-нибудь объяснить мне это.

Этот код, который добавляет 24 дня к текущему времени:

long nowL = System.currentTimeMillis();
Date now = new Date(nowL);
System.out.println("now = "+now);
Date future = new Date(nowL+ 24*24*60*60*1000);
System.out.println("future = "+future);

дает правильный вывод:

сейчас = чт 11 июня 10:50:09 IDT 2009

будущее = вс 5 июля 10:50:09 IDT 2009

пока этот код, который добавляет 25 дней:

long nowL = System.currentTimeMillis();
Date now = new Date(nowL);
System.out.println("now = "+now);
Date future = new Date(nowL+ 25*24*60*60*1000);
System.out.println("future = "+future);

дает этот вывод:

сейчас = чт 11 июня 10:51:25 IDT 2009

будущее = вс 17 мая 17:48:37 IDT 2009

Я могу понять разницу в часах, даже днях, но кто-нибудь может объяснить, почему добавление слишком большого количества миллисекунд вызывает возврат во времени ?? Я сбит с толку.

Ответы [ 2 ]

27 голосов
/ 11 июня 2009

25 * 24 * 60 * 60 * 1000 = 2160000000 = 0x80BEFC00

Вы вычисляете целочисленное значение и получаете переполнение. если бы это было

25 * 24 * 60 * 60 * 1000L

все должно быть хорошо.

5 голосов
/ 11 июня 2009

Это не ошибка в классе Date, это случай целочисленного переполнения. int s в Java может быть только между -2 31 и 2 31 - 1, но 25 & times; 24 раза; 60 раз; 60 раз; 1000 больше 2 31 - 1, поэтому оно переполняется.

Если вы запустите

System.out.println(24*24*60*60*1000);
System.out.println(25*24*60*60*1000);

вы получите результаты

2073600000
-2134967296

Если вы укажете одно из чисел, которые вы умножаете вместе, как long, добавив к нему суффикс L, продукт также будет long. long значения могут доходить до 2 63 - 1, поэтому вы не получите переполнения, если не добавите лот дней к вашим Date с. Например,

System.out.println(25L*24*60*60*1000);

дает вам

2160000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...