Неверное преобразование даты
Сегодня 5 мая. Следующий код должен выводиться 11 апреля и 10 апреля. Вместо этого я получаю 11 апреля и 29 мая. Вот код:
int daysBack = 24;
long dayBeginningMilis = getTodaysBeginningMilis() - 86400000 * daysBack;
Log.i(TAG, "Date: " + new Date(dayBeginningMilis));
daysBack = 25;
dayBeginningMilis = getTodaysBeginningMilis() - 86400000 * daysBack;
Log.i(TAG, "Date: " + new Date(dayBeginningMilis));
private long getTodaysBeginningMilis() {
// Get milis of todays beginning
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.HOUR, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Kiev"));
return calendar.getTimeInMillis();
}
Выход:
Date: Tue Apr 11 00:00:00 EEST 2017
Date: Mon May 29 17:02:47 EEST 2017
Почему это происходит?
1 ответ
Я нашел виновника. Кажется, что умножение целых чисел выводит их за пределы, и они автоматически не конвертируются в Long. Это изменение решило проблему:
long daysBack = 24L;
long dayBeginningMilis = getTodaysBeginningMilis() - 86400000L * daysBack;
Log.i(TAG, "Date: " + new Date(dayBeginningMilis));
daysBack = 25L;
dayBeginningMilis = getTodaysBeginningMilis() - 86400000L * daysBack;
Log.i(TAG, "Date: " + new Date(dayBeginningMilis));