Ваш вопрос не ясен.
- Возможно, вы имеете в виду, что у вас есть значение в UTC и вы хотите настроить его на смещение на 360 минут до UTC. (Плохой способ общения на мгновение.)
- Или, возможно, вы имели в виду, что данное значение уже опережает UTC. (Еще худший способ общения на мгновение.)
Начиная с UTC
Сначала проанализируйте ваш введенный номер. Предположим, что число - это число в миллисекундах с первого момента 1970 UTC, 1970-01-01T00: 00Z.
Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичного знака). доля).
Instant instant = Instant.ofEpochMilli( 1_514_564_669_355L ) ;
instant.toString (): 2017-12-29T16: 24: 29,355Z
смещение от UTC - это количество часов, минут и секунд до или после UTC .
Возможно, в вашем вопросе упоминание о смещении 360 подразумевается на 360 минут или на 6 часов раньше UTC.
Класс ZoneOffset
не может быть создан из числа минут свыше 59. Поэтому мы конвертируем из 360 минут в общее количество секунд.
int seconds = ( int ) TimeUnit.MINUTES.toSeconds( 360L ) ; // Convert minutes to seconds.
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds ); // Determine offset-from-UTC.
offset.toString (): +06: 00
Отрегулируйте Instant
в UTC до этого смещения, получив объект OffsetDateTime
. Тот же самый момент, та же самая точка на временной шкале, другое время настенных часов. Таким образом, время дня рассматривается как 22:00, а не как 16:00, поскольку (16 + 6) = 22.
OffsetDateTime odt = instant.atOffset( offset );
odt.toString (): 2017-12-29T22: 24: 29,355 + 06: 00
Начиная со смещения
Возможно, вы имели в виду, что передаваемый момент - это количество миллисекунд от UTC, но затем число миллисекунд в 360 минутах уже было добавлено или вычтено.
Кстати, это очень плохой способ обмена значениями даты и времени. Сообщите поставщику ваших данных о стандарте ISO 8601 .
Давайте отменим сложение / вычитание смещения, чтобы вернуться в UTC.
long millisInOffset = TimeUnit.MINUTES.toMillis( 360L ); // Convert minutes to milliseconds.
long millisSinceEpoch = ( 1_514_564_669_355L - millisInOffset );
Instant instant = Instant.ofEpochMilli( millisSinceEpoch );
instant.toString (): 2017-12-29T10: 24: 29,355Z
См. Это значение в смещении, отправленном нам.
int seconds = ( int ) TimeUnit.MILLISECONDS.toSeconds( millisInOffset );
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds );
OffsetDateTime odt = instant.atOffset( offset );
System.out.println( odt );
2017-12-29T16: 24: 29,355 + 06: 00
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые унаследованные классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще .