Как преобразовать дату в юлианский формат в 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

Другие вопросы по тегам