Календарь Java получает текущую дату без часов, минут, секунд и миллисекунд, в миллисекундах
Я хотел бы получить текущую дату в миллисекундах с указанием только года, месяца и даты. Но когда я использую этот код:
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();
Я все еще получаю время в миллисекундах с часом. Как я могу это исправить?
Ответы
Ответ 1
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
currentDate = cal.getTimeInMillis();
Будьте осторожны в часовом поясе своего Календаря.
Ответ 2
Если вам нужен только этот относительный GMT и явно требуется миллисекунды, вы можете использовать это:
long now = System.currentTimeMillis();
long today = now - now % 86400000;
Ответ 3
из javadoc: поля HOUR_OF_DAY, HOUR и AM_PM обрабатываются независимо, и применяется правило разрешения для времени суток. Очистка одного из полей не сбрасывает значение часа в календаре. Используйте set (Calendar.HOUR_OF_DAY, 0), чтобы сбросить значение часа.
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
может потребоваться установить AM/PM, а также
Ответ 4
TL;DR
LocalDate.now()
LocalDate
Если вы хотите на самом деле просто дату без времени, используйте класс LocalDate
.
Класс LocalDate
представляет значение даты только без времени и без часового пояса.
Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париж Франция - это новый день, пока еще "вчера" в Монреаль Квебек.
Укажите имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, например EST
или IST
, поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
ZonedDateTime
Если вам нужна дата со временем дня, установленным в первый момент дня, попросите java.time определить этот момент для вас. Не предполагайте, что первый момент в 00:00:00. Аномалии, такие как переход на летнее время, означают, что первый момент может произойти в другое время, например, 01:00:00.
Используйте этот объект часового пояса, ZoneId
, чтобы сгенерировать объект ZonedDateTime
.
ZonedDateTime zdt = today.atStartOfDay( z ); // Determine the first moment of the day on this date for this time zone.
Чтобы просмотреть этот момент в качестве значения в UTC, извлеките объект Instant
.
Instant instant = zdt.toInstant();
Избегать устаревших классов времени
Избегайте трудных старых классов времени, таких как Calendar
. Теперь они устаревают, вытесняются классами java.time.
О java.time
Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.
Ответ 5
Если вы хотите использовать Joda time:
long millis = new DateMidnight().getMillis();