Как узнать количество секунд, прошедших с полуночи с Java? - PullRequest
28 голосов
/ 08 декабря 2010

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

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

Ответы [ 8 ]

61 голосов
/ 08 декабря 2010

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

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

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

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;
5 голосов
/ 16 января 2016

ТЛ; др

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, и используйте эту дату, чтобы спросить 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?

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

5 голосов
/ 13 января 2016

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, даже если вы хотите использовать значение по умолчанию.

2 голосов
/ 10 декабря 2015

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

Однократная настройка:

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);

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

1 голос
/ 11 июля 2017

Используйте 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);
1 голос
/ 10 января 2017

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

int seconds = DateTime.now().secondOfDay().get();
int millis = DateTime.now().millisOfDay().get();
0 голосов
/ 08 декабря 2010

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

long millisSinceGMTMidnight = System.currentTimeMillis() % (24*60*60*1000);
0 голосов
/ 08 декабря 2010
(System.currentTimeMillis()/1000) % (24 * 60 * 60)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...