2013-09-22 3 views
5

Что не так? Я предполагаю, что если я вычитаю 1 мс с 1 января 1980 года 0: 0: 0, то у меня есть 1979. Но для этого я должен вычесть около 500 + мс. Пожалуйста, дайте мне подсказку.Вычитание 1 мсек приводит к неожиданному поведению

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.set(1980, 0, 1, 0, 0, 0) 
val date = new Date 
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0 
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!! 

Обновлено.

Решение

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.setTimeInMillis(0) 
cal.set(1980, 0, 1, 0, 0, 0) 
+0

Просто догадаться, но, возможно, внутренне календарь округляет секунды? – Aaron

+0

Попробуйте распечатать содержимое «даты» после первого вызова 'setTime()'. Возможно, год, месяц, день, час, минута и секунда - это значение, которое вы установили, но не миллисекунды. –

+0

Немного смущает. Я не хочу использовать Yoda Time или другую библиотеку третьей части. Мне нужно преобразовать год, месяц, день в миллисекунды, а затем получить последнюю миллисекунду дня. Я хочу найти правильное решение для этого. К сожалению, Джавадок молчал о такой ситуации. – Ezhik

ответ

5

Calendar.set(year, month, day, hourOfDay, minute, second) С не установлены не миллисекунды. Следовательно, реализация календаря устанавливает миллисекунды на «неизвестный», который фактически рассматривается как средняя точка в течение данной секунды.

Вычитание 500 мс означает, что вы просто переходите через середину. То же самое должно произойти, если вы добавите 500 мс, что должно принести вам чуть больше секунды. Фактически вычитание 500 мс работает, и вы должны добавить 620 мс, чтобы увидеть следующую секунду.

+0

И как правильно получить последнюю миллисекунду 1979 года? – Ezhik

+0

вычитание 500 мс не обязательно даст последнюю миллисекунду 1979. –

+0

@ Ежик, явно задает миллисекунды с помощью 'calendar.set (Calendar.MILLISECOND, 0);'. Когда вы вычитаете одну миллисекунду из того, что вы сразу получаете в прошлом миллисекунде в 1979 году. – jboi

Смежные вопросы