Как преобразовать дату в юлианский формат в Java?
У меня есть поток значений даты, которые приходят ко мне в числовом формате, который я предполагаю, что это юлианский формат (не уверен в этом). Мне нужно сравнить эти даты с моей собственной датой, поэтому мне нужно преобразовать "мою" дату в этот числовой формат. Я не могу сделать наоборот для проблем с производительностью.
Пример. Моя дата си в "классическом" формате:
"Wed Jan 21 10:21:57 CET 2015"
Мне нужно преобразовать его в этот числовой формат (это Джулиан?):
"1421832117"
Как? Обратите внимание: в юлианской дате мне нужна также информация о времени, а не только дата!
Большое спасибо.
2 ответа
Подсчет секунд с 1970 года
Вы, очевидно, ошибочно посчитали число целых секунд, начиная с эпохи первого момента 1970 года по Гринвичу, как число юлианского дня. Хотя оба имеют значение, это исключительно звери.
Юлианское число дней - это число целых или дробных дней с 1 января 4713 г. до н.э., в пролептическом юлианском календаре (24 ноября 4714 г. до н.э., в пролептическом григорианском календаре). Номер юлианского дня для даты, показанной ниже, 2015-01-21
является 2457043
, Сильно отличается от 1421832117
вход видел в вопросе.
java.time
Используя инфраструктуру java.time, встроенную в Java 8 и более поздние версии, мы можем легко преобразовать ваш счетчик секунд в объект даты и времени. Смотрите Oracle Tutorial, чтобы узнать о java.time. Большая часть функциональности java.time была перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP.
Instant
это момент времени на UTC с разрешением до наносекунд.
Instant now = Instant.now();
Мы можем легко преобразовать ваш счетчик секунд с начала 1970 UTC в Instant
объект.
long seconds = 1421832117L; // Count of whole seconds since start of 1970 UTC.
Instant instant = Instant.ofEpochSecond ( seconds );
Вы можете посмотреть это по часам часового пояса. Избегайте использования 3-4 буквенных сокращений, таких как CET
поскольку это не настоящие часовые пояса, они не стандартизированы и даже не являются уникальными (!). Правильное название часового пояса в формате continent/region
,
ZoneId zoneId = ZoneId.of ( "Europe/Paris" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
Дамп на консоль.
System.out.println ( "seconds:" + seconds + " | instant: " + instant + " | zdt: " + zdt );
секунд:1421832117 | мгновенное: 2015-01-21T09:21:57Z | zdt: 2015-01-21T10:21:57+01:00[Европа / Париж]
Вы можете передать Arg (Input) с указанным вами форматом даты, и метод, приведенный ниже, проанализирует его в Millis (ваш желаемый формат)
private void parseDateTime(String input){
DateTimeZone CET = DateTimeZone.forID("CET");
DateTimeFormatter dtf = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss 'CET' yyyy").withZone(CET);
DateTime parsed = dtf.parseDateTime(input);
Log.d("Millis for classic","" + parsed.getMillis());
}
ВЫХОД: 01-28 20:40:56.787: D/Millis для классики (22559): 1421832117000