2015-05-27 1 views
1

Мне нужно конвертировать секунды в UTC в день, затем добавить интервал в один день и вернуть секунды в UTC.Как получить первые секунды следующего дня в зависимости от текущих секунд?

Вот что у меня есть:

вариант # 1

public static final long nextDayStartSec(long epochSecondsInUTC) { 
    return (epochSecondsInUTC/TimeUnit.DAYS.toSeconds(1) + 1) * TimeUnit.DAYS.toSeconds(1); 
} 

Но не все дни содержат 86400 согласно Wikipedia:

Современные Unix времени основано на UTC , который рассчитывает время с использованием секунд SI, и разрывает промежуток времени в дни почти всегда 86400 секунд длинный, но из-за прыжка секунд иногда 86401 секунд.

вариант # 2

public static final long nextDayStartSec(long epochSecondsInUTC) { 
    return DateUtils.addMilliseconds(DateUtils.round(new Date(TimeUnit.SECONDS.toMillis(epochSecondsInUTC)), Calendar.DATE), -1) 
      .toInstant().atZone(systemDefault()).toLocalDateTime().toEpochSecond(ZoneOffset.UTC); 
} 

Но он использует широкий спектр библиотек (в том числе Apache Commons) и трудно читать.

Есть ли что-то простое, что я пропустил?

+0

Время Unix не знает секунд прыжка, но не UTC. Поэтому данный ответ @assylias вполне удовлетворяет, если вы, как большинство пользователей, хотите игнорировать эту экзотическую функцию. Вы еще хотите увидеть ответ, связанный со скачкообразными секундами? –

+0

И я сильно подозреваю, что ваш ввод «epochSecondsInUTC» на самом деле не является секундомерным отсчетом времени UTC, а скорее подсчет секунд без повторения с UNIX на период с 1970-01-01T00Z. Поэтому мой вывод и совет - просто принять ответ @assylias. –

ответ

2

Если вы используете Java 8, новое время API позволяет писать его таким образом (это добавляет один день в данный момент):

public static final long nextDayStartSec(long epochSecondsInUTC) { 
    OffsetDateTime odt = Instant.ofEpochSecond(epochSecondsInUTC).atOffset(ZoneOffset.UTC); 
    return odt.plusDays(1).toEpochSecond(); 
} 

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

public static final long nextDayStartSec(long epochSecondsInUTC) { 
    OffsetDateTime odt = Instant.ofEpochSecond(epochSecondsInUTC).atOffset(ZoneOffset.UTC); 
    return odt.toLocalDate().plusDays(1).atStartOfDay(ZoneOffset.UTC).toEpochSecond(); 
} 
+1

Не нужно делать 'OffsetDateTime.of (dateTime, ZoneOffset.UTC)'. Вместо этого просто вызовите 'dateTime.atOffset (ZoneOffset.UTC)'. Методы «at» предназначены для удобного потока. В этом случае вы даже можете назвать 'date.atStartOfDay (ZoneOffset.UTC) .toEpochSecond()'. – JodaStephen