Подтвердить что ты не робот

Загадочный миллисекунд, найденный в Java Date/Calendar object

При использовании Date и Calendar появляется странная странность. Я хочу создать конкретную дату, например.

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime(); 

Теперь дело в том, что оно показывает правильную дату, но при отладке я вижу под переменной даты "время", например, -3599459. Это заставляет мои тесты JUnit терпеть неудачу, потому что ожидаемое значение -3600000. Кажется, календарь добавляет 541 миллисекунды или что-то вроде при инициализации...

Вопрос: невозможно ли просто создать фиксированную дату без этого? Я добавляю некоторые миллисекунды в фоновой функции-призрак?

4b9b3361

Ответ 1

Добавьте эту строку перед вызовом cal.getTime():

cal.set(Calendar.MILLISECOND, 0);

Это позволит вам установить миллисекунды на ноль.

Ответ 2

В документах для метода set вы вызываете:

Устанавливает значения для полей YEAR, MONTH, DAY_OF_MONTH, HOUR, MINUTE и SECOND. Предыдущие значения других полей сохраняются. Если это нежелательно, сначала вызовите clear().

Таким образом, он сохраняет значение миллисекунды. Он не добавляет несколько миллисекунд - он принимает системное время, когда вы вызываете getInstance, как это описано в документе.

Сначала вызовите clear() или явно установите значение миллисекунды. (Лично я бы использовал clear(). Я бы также явно установил часовой пояс, чтобы просто уточнить, в какое время вы ожидаете.

В качестве альтернативы, используйте Joda Time, чтобы начать - это гораздо более приятный API даты/времени.

Ответ 3

Общепринятой практикой является введение объекта Clock для обертывания всего доступа к вашему API Дата/Время.

По существу, у вас есть две реализации - SystemTimeClock, которая перенаправляет все вашему выбранному поставщику Date/Time и издеваемую реализацию, которая будет использоваться для тестов.

Таким образом, ваш код становится независимым от специфики API, и ваши тесты выполняются плавно.

Ответ 5

Проблема заключается в том, что "set" не устанавливает значение "миллисекунды", поэтому значение миллисекунды по-прежнему является значением, которое оно имело при создании календаря с помощью getInstance. Вы можете позвонить

cal.set(Calendar.MILLISECOND, 0);

перед вызовом getTime, это гарантирует, что миллисекунды равны 0. Вы также можете напрямую создать gregorian календарь:

Calendar cal = new GregorianCalendar(1970, 0, 1, 0, 0, 0);
assertEquals(0, cal.get(Calendar.MILLISECOND));

Если вы хотите более полную реализацию функций календаря и времени, вы можете использовать Joda Time вместо стандартного Java Calendar API.

Ответ 6

Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date());