Мне нужна функция, которая дает мне сколько секунд прошло с полуночи. В настоящее время я использую System.currentTimeMillis()
, но он дает мне временную метку UNIX.
Это был бы бонус для меня, если бы я мог получить миллисекунды тоже.
Мне нужна функция, которая дает мне сколько секунд прошло с полуночи. В настоящее время я использую System.currentTimeMillis()
, но он дает мне временную метку UNIX.
Это был бы бонус для меня, если бы я мог получить миллисекунды тоже.
Если вы используете 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;
Использование фреймворка 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
, даже если вы хотите использовать значение по умолчанию.
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 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 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
и другие.
Самый простой и быстрый способ получить секунды с полуночи для текущего часового пояса:
Единовременная настройка:
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);
Обратите внимание, что вам нужно будет переустановить, если есть вероятность того, что ваша программа будет работать достаточно долго, и произойдет переход на летнее время...
Используя JodaTime, вы можете позвонить:
int seconds = DateTime.now().secondOfDay().get();
int millis = DateTime.now().millisOfDay().get();
Используйте 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);
(System.currentTimeMillis()/1000) % (24 * 60 * 60)
Как и @secmask, если вам понадобится миллисекунд с полуночи GMT, попробуйте
long millisSinceGMTMidnight = System.currentTimeMillis() % (24*60*60*1000);