Ответ 1
Добавьте эту строку перед вызовом cal.getTime()
:
cal.set(Calendar.MILLISECOND, 0);
Это позволит вам установить миллисекунды на ноль.
При использовании Date
и Calendar
появляется странная странность. Я хочу создать конкретную дату, например.
Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime();
Теперь дело в том, что оно показывает правильную дату, но при отладке я вижу под переменной даты "время", например, -3599459
. Это заставляет мои тесты JUnit
терпеть неудачу, потому что ожидаемое значение -3600000
.
Кажется, календарь добавляет 541 миллисекунды или что-то вроде при инициализации...
Вопрос: невозможно ли просто создать фиксированную дату без этого? Я добавляю некоторые миллисекунды в фоновой функции-призрак?
Добавьте эту строку перед вызовом cal.getTime()
:
cal.set(Calendar.MILLISECOND, 0);
Это позволит вам установить миллисекунды на ноль.
В документах для метода set
вы вызываете:
Устанавливает значения для полей YEAR, MONTH, DAY_OF_MONTH, HOUR, MINUTE и SECOND. Предыдущие значения других полей сохраняются. Если это нежелательно, сначала вызовите clear().
Таким образом, он сохраняет значение миллисекунды. Он не добавляет несколько миллисекунд - он принимает системное время, когда вы вызываете getInstance
, как это описано в документе.
Сначала вызовите clear()
или явно установите значение миллисекунды. (Лично я бы использовал clear()
. Я бы также явно установил часовой пояс, чтобы просто уточнить, в какое время вы ожидаете.
В качестве альтернативы, используйте Joda Time, чтобы начать - это гораздо более приятный API даты/времени.
Общепринятой практикой является введение объекта Clock
для обертывания всего доступа к вашему API Дата/Время.
По существу, у вас есть две реализации - SystemTimeClock
, которая перенаправляет все вашему выбранному поставщику Date/Time и издеваемую реализацию, которая будет использоваться для тестов.
Таким образом, ваш код становится независимым от специфики API, и ваши тесты выполняются плавно.
При работе с датами я очень доволен библиотекой Joda Time. Я знаю, что это не совсем ответ на ваш вопрос, но, возможно, стоит посмотреть: http://joda-time.sourceforge.net/ JavaDocs: http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html
Проблема заключается в том, что "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.
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());