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

Календарь Java получает текущую дату без часов, минут, секунд и миллисекунд, в миллисекундах

Я хотел бы получить текущую дату в миллисекундах с указанием только года, месяца и даты. Но когда я использую этот код:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();

Я все еще получаю время в миллисекундах с часом. Как я могу это исправить?

4b9b3361

Ответ 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?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.

Ответ 5

Если вы хотите использовать Joda time:

   long millis = new DateMidnight().getMillis();