Как я могу конвертировать из григорианского календаря в Unix Time на Java? - PullRequest
14 голосов
/ 26 октября 2010

Мне нужен метод для преобразования объекта GregorianCalendar в Unix Time (т.е. длинный). Также нужен метод для преобразования Unix Time (long) обратно в объект GregorianCalendar. Есть ли какие-либо методы, которые делают это? Если нет, то как я могу это сделать? Любая помощь будет принята с благодарностью.

Ссылка на класс GregorianCalendar -> http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

Спасибо.

Ответы [ 5 ]

30 голосов
/ 26 октября 2010

Методы getTimeInMillis() и setTimeInMillis(long) позволят вам получить и установить время в миллисекундах, то есть время Unix, умноженное на 1000. Вам придется корректировать вручную, поскольку время Unix не включает миллисекунды - только секунды.

long unixTime = gregCal.getTimeInMillis() / 1000;
gregCal.setTimeInMillis(unixTime * 1000);

в сторону : если вы часто используете даты в своем приложении, особенно если вы конвертируете даты или используете несколько часовых поясов, я настоятельно рекомендую использовать JodaTime библиотека.Он очень полный и немного более естественный для понимания, чем система Calendar, которая поставляется с Java.

1 голос
/ 26 октября 2010

Проверьте функции setTimeInMillis и getTimeInMillis: http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()

1 голос
/ 26 октября 2010

Я считаю, что GregorianCalendar.getTimeInMillis () и GregorianCalendar.SetTimeInMillis () позволит вам получать и устанавливать длинные значения так, как вы хотите.

0 голосов
/ 15 февраля 2018

ТЛ; др

myGregCal.toZonedDateTime().toEpochSecond()                     // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`.

И идет в другом направлении ...

GregorianCalendar.from(                                         // Convert from modern `ZonedDateTime` to troublesome legacy class `GregorianCalendar`.
    Instant.ofEpochSecond( yourCountOfWholeSecondsSinceEpoch )  // Moment in UTC.
        .atZone(                                                // Apply `ZoneId` to `Instant` to produce a `ZonedDateTime` object.
            ZoneId.of( "Africa/Tunis" ) 
        )
)                                                              

Избегайте устаревших классов даты и времени

Другие ответы правильные и короткие. Но, к вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat теперь наследие , вытеснены java.time классы, встроенные в Java 8 и Java 9.

Итак, вот как конвертировать и использовать современные классы вместо вашей проблемы.

java.time

Преобразование из унаследованного класса GregorianCalendar в современный класс ZonedDateTime. Вызовите новые методы, добавленные к старым классам.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

И идет в другом направлении ...

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

Если под «Unix time» вы подразумевали количество целых секунд с эталонной эпохи первого момента 1970 года в UTC, 1970-01-01T00: 00: 00Z, затем позвоните toEpochSecond.

long secondsSinceEpoch = zdt.toEpochSecond() ;

Если вы имели в виду подсчет миллисекунд с 1970 года, начатый в UTC, извлеките Instant. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Instant instant = zdt.toInstant() ;

Теперь запрашивать счет миллисекунд .

long millisecondsSinceEpoch = instant.toEpochMill() ;

Имейте в виду, что запрос целых секунд или миллисекунд может привести к потере данных. ZonedDateTime и Instant разрешают до наносекунд. Поэтому любые микросекунды или наносекунды, которые могут присутствовать, будут игнорироваться при подсчете ваших целых секунд или миллисекунд.


О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Используя драйвер JDBC , совместимый с JDBC 4.2 или новее, вы можете напрямую обмениваться объектами java.time с вашей базой данных. Нет необходимости ни в строках, ни в java.sql. * Классах.

Где получить классы 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
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

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

0 голосов
/ 26 октября 2010

Calendar.getTimeInMillis () должен быть тем, что вы ищете.

...