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

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

Мне нужна функция, которая дает мне сколько секунд прошло с полуночи. В настоящее время я использую System.currentTimeMillis(), но он дает мне временную метку UNIX.

Это был бы бонус для меня, если бы я мог получить миллисекунды тоже.

4b9b3361

Ответ 1

Если вы используете Java> = 8, это легко сделать:

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime midnight = now.atStartOfDay();
Duration duration = Duration.between(midnight, now);
long secondsPassed = duration.getSeconds();

Если вы используете Java 7 или менее, вы должны получить дату от полуночи через календарь, а затем вычесть.

Calendar c = Calendar.getInstance();
long now = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long passed = now - c.getTimeInMillis();
long secondsPassed = passed / 1000;

Ответ 2

java.time

Использование фреймворка java.time встроенного в Java 8 и новее. Смотрите учебник.

import java.time.LocalTime
import java.time.ZoneId

LocalTime now = LocalTime.now(ZoneId.systemDefault()) // LocalTime = 14:42:43.062
now.toSecondOfDay() // Int = 52963

Рекомендуется явно указывать ZoneId, даже если вы хотите использовать значение по умолчанию.

Ответ 3

ТЛ; др

Instant then =                             // Represent a moment in UTC.
    ZonedDateTime                          // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone).
    .now(                                  // Capture the current moment. Holds up to nanosecond resolution, but current hardware computer clocks limited to microseconds for telling current time.
        ZoneId.of( "Africa/Casablanca" )   // Specify the time zone. Never use 2-4 letter pseudo-zones such as 'IST', 'PST', 'EST'.
    )                                      // Returns a 'ZonedDateTime' object.
    .toLocalDate()                         // Extract the date-only portion, without time-of-day and without time zone.
    .atStartOfDay(                         // Deterimine the first moment of the day on that date in that time zone. Beware: The day does *not* always begin at 00:00:00.
        ZoneId.of( "Africa/Casablanca" )   // Specify the time zone for which we want the first moment of the day on that date.
    )                                      // Returns a 'ZonedDateTime' object.
    .toInstant()                           // Adjusts from that time zone to UTC. Same moment, same point on the timeline, different wall-clock time.
;

...

Duration                                   // Represent a span-of-time unattached to the timeline in terms of hours-minutes-seconds.
.between(                                  // Specify start and stop moments.
    then ,                                 // Calculated in code seen above.
    Instant.now()                          // Capture current moment in UTC. 
)                                          // Returns a 'Duration' object.
.getSeconds()                              // Extract the total number of whole seconds accross this entire span-of-time.

java.time

Java 8 и более поздние версии имеют встроенную инфраструктуру java.time.

Используя ZonedDateTime и часовой пояс, мы обрабатываем такие аномалии, как летнее время (DST). Например, в Соединенных Штатах день может длиться 23, 24 или 25 часов. Так что время до завтра может варьироваться на ± 1 час от одного дня к другому.

Сначала получите текущий момент.

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

Теперь извлеките часть только для LocalDate, LocalDate, и используйте эту дату, чтобы спросить java.time, когда этот день начался для нашего желаемого часового пояса. Не думайте, что день начался в 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что день может начаться в другое время, например 01:00:00.

ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( z );  // Crucial to specify our desired time zone!

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

Duration duration = Duration.between( todayStart , now );

Спросите у объекта Duration общее количество секунд за весь промежуток времени.

long secondsSoFarToday = duration.getSeconds();

О java.time

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

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

Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация 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 и другие.

Ответ 4

Самый простой и быстрый способ получить секунды с полуночи для текущего часового пояса:

Единовременная настройка:

static final long utcOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis());

Если вы используете Apache Commons, вы можете использовать DateUtils.DAY_IN_MILLIS, иначе определите:

static final long DAY_IN_MILLIS = 24 * 60 * 60 * 1000;

И тогда, когда вам нужно время...:

int seconds = (int)((System.currentTimeMillis() + utcOffset) % DateUtils.DAY_IN_MILLIS / 1000);

Обратите внимание, что вам нужно будет переустановить, если есть вероятность того, что ваша программа будет работать достаточно долго, и произойдет переход на летнее время...

Ответ 5

Используя JodaTime, вы можете позвонить:

int seconds = DateTime.now().secondOfDay().get();
int millis = DateTime.now().millisOfDay().get();

Ответ 6

Используйте getTime(). getTime() вместо getTimeInMillis(), если вы получите сообщение об ошибке защиты календаря. Помните свой импорт:

import java.util.*; 

будет включать их все во время отладки:

    Calendar now = Calendar.getInstance();
    Calendar midnight = Calendar.getInstance();
    midnight.set(Calendar.HOUR_OF_DAY, 0);
    midnight.set(Calendar.MINUTE, 0);
    midnight.set(Calendar.SECOND, 0);
    midnight.set(Calendar.MILLISECOND, 0);
    long ms = now.getTime().getTime() - midnight.getTime().getTime();
    totalMinutesSinceMidnight = (int) (ms / 1000 / 60);

Ответ 7

(System.currentTimeMillis()/1000) % (24 * 60 * 60)

Ответ 8

Как и @secmask, если вам понадобится миллисекунд с полуночи GMT, попробуйте

long millisSinceGMTMidnight = System.currentTimeMillis() % (24*60*60*1000);