Как получить количество миллисекунд, прошедших сегодня

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

Я попробовал это:

Date date=new Date() ;  
System.out.println("Today is " +date.getTime());

Он вернет миллисекунды с 1 января 1970 года.

Но мне нужны текущие миллисекунды сегодняшней даты, например:

23:59:00 = 86340000 milliseconds

Ответ 1

Это не правильный подход для Java 8 или новее. Этот ответ сохраняется для потомков; для любой разумно современной Java использует подход Basil Bourque.


Кажется, что работает.

Calendar rightNow = Calendar.getInstance();

// offset to add since we're not UTC
long offset = rightNow.get(Calendar.ZONE_OFFSET) +
    rightNow.get(Calendar.DST_OFFSET);
long sinceMidnight = (rightNow.getTimeInMillis() + offset) %
    (24 * 60 * 60 * 1000);

System.out.println(sinceMidnight + " milliseconds since midnight");

Проблема в том, что date.getTime() возвращает число миллисекунд с 1970-01-01T00: 00: 00Z, но new Date() указывает текущее местное время. Добавление ZONE_OFFSET и DST_OFFSET из класса Calendar дает вам время в часовом поясе по умолчанию.

Ответ 2

Пытаться:

(d.getTime() % (86400000))

Примечание: 86400000 - это количество миллисекунд в день.

Ответ 3

java.time

В современном подходе используются классы java.time, которые вытесняют неприятные старые устаревшие классы времени.

Получение промежутка времени с начала сегодняшнего дня до текущего момента более сложно, чем вы могли ожидать.

Текущий момент

Во-первых, для определения "сегодня" требуется часовой пояс. Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париже Франция - новый день, еще "вчера" в Монреале Квебек.

Укажите правильное название часового пояса в формате continent/region, например, America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте псевдо-зоны 3-4 букв, такие как EST или IST поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;

Если вы хотите использовать текущий часовой пояс JVM, задайте его и передайте в качестве аргумента. Если этот параметр опущен, то действующий по умолчанию JVM применяется неявно. Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.

ZoneId z = ZoneId.systemDefault() ;  // Get JVMs current default time zone.

Класс ZonedDateTime представляет момент (дату и время дня), как видно людям определенного региона (часовой пояс, ZoneId).

ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Начало дня

Затем нам нужно определить первый момент дня. Не думайте, что день начинается в 00:00:00. Из-за аномалий, таких как летнее время (DST), день может начинаться в другое время, например, 01:00:00. Пусть java.time определяет первый момент дня в определенной зоне на определенную дату.

Сначала извлеките только часть даты только нашего объекта ZonedDateTime.

LocalDate ld = zdt.toLocalDate() ;

Попросите первый момент дня в нашей желаемой зоне.

ZonedDateTime zdtStartOfDay = ld.atStartOfDay( z ) ;

Пройденное время

Теперь у нас есть пара штук, которые нам нужны: первый момент дня и текущий момент. Мы запрашиваем ChronoUnit перечисления MILLISECONDS для вычисления времени, прошедшего между этой парой. Обратите внимание, что это может означать потерю данных, поскольку объекты ZonedDateTime могут удерживать микросекунды или наносекунды, игнорируемые в этом расчете миллисекунд.

long millisElapsedToday = ChronoUnit.MILLISECONDS.between( zdtStartOfDay , zdt ) ;

Вы также можете быть заинтересованы в том, чтобы представить этот промежуток времени как непривязанный к временной шкале в объекте Duration.

Duration d = Duration.between( zdtStartOfDay , zdt ) ;

О java.time

Рамка java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режиме обслуживания, советует перейти на классы java.time.

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.

С JDBC-драйвером, совместимым с JDBC 4.2 или более поздней версией, вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Нет необходимости в строках или java.sql * classes.

Где можно получить классы 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
    • Более поздние версии реализаций пакетов Android классов java.time.
    • Для более ранних Android проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP....

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

Ответ 4

Используйте этот код, чтобы получить текущую дату и время

DateFormat dateFormat = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
        Calendar calendar=Calendar.getInstance();
        Date date=calendar.getTime();
        date.getHours();
        date.getMinutes();
        date.getMonth();
        date.getSeconds();
        date.getYear();