Что это за формат даты и времени?

Я разрабатываю приложение для Android и использую GSON для получения данных с сервера. Я работаю над API-интерфейсами Facebook и Imgur, и возникает та же проблема. Как я могу преобразовать дату из формата в миллисекундах в удобочитаемый формат, например, 1584780523, и я хочу преобразовать ее в любой формат, например, 25 марта 2020 года .

Что я пытался сделать!

Получить данные

@SerializedName("datetime")
    @Expose
    private long datetime;

    // setters and getters

В моем адаптере после получения DATETIME я анализирую его в удобочитаемом формате

// Get Datetime. 
long getDate = data.getDatetime();

// Parse it in this format for example.
DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy HH:mm:ss:SSS Z");
Date result = new Date(getDate);

// Set Result (Human-Readable date)
date.setText(dateFormat.format(result));

Но здесь есть проблема! Это дает мне дату, как это

19 января 1970 г. 09: 54: 00: 533 +0200

Почему выход в 1970-х гг. Я видел что-то подобное, это вывод по умолчанию Datetime? Но в том же случае он дает мне на других элементах моего RecyclerView тот же вывод, но последние три цифры меняются!

Вот что я спрашиваю!

1- Почему мы используем (многие люди используют long вместо int?

2- Почему вывод дает мне это и как я могу это исправить?

3- В других API, таких как Youtube, они используют обычный DateTime, почему Facebook и Imgur меняют их?

Примечание: я искал свой вопрос в течение 3 дней, но я не получил ни ответов, ни относительных вопросов по StackOverflow, поэтому я спросил здесь. Все они или большинство для PHP и JavaScript, мне нужен пример в Java Android Studio

Спасибо.

Всего 2 ответа


Ваше значение 1584780523 указывается в секундах , а не в миллисекундах .

long secondsSinceEpoch = 1584780523;
long millisSinceEpoch = secondsSinceEpoch * 1000L;
Date date = new Date(millisSinceEpoch);
System.out.println(date);

SimpleDateFormat fmt = new SimpleDateFormat("d, MMM yyyy", Locale.US);
System.out.println(fmt.format(date));

Выход 1

Sat Mar 21 04:48:43 EDT 2020
21, Mar 2020

1) Я в America/New_York часовой пояс America/New_York


1- Почему мы используем (многие люди используют long вместо int?

Это позволит избежать проблемы 2038 года. Хотя, например, 1584780523 вписывается в int (32-разрядное целое число со знаком), могут быть представлены только даты и время до 19 января 2038 03:14:07 UTC. При написании программы сегодня мы не можем быть уверены, что никто не будет использовать наш код для дат и времени после этого момента. Так что вместо этого мы используем long . После проблемы 2000 года (использование двухзначных лет, приводящих к проблемам для дат в 2000 году и позже), я полагаю, что ИТ-сообщество взяло на себя обязательство больше не использовать представления даты и времени, которые имеют конечную дату в течение нашей жизни.

2- Почему вывод дает мне это и как я могу это исправить?

Андреас уже объяснил эту часть: потому что вы рассматривали свои секунды как миллисекунды. Это распространенная ошибка.

Кстати, я рекомендую использовать проверенную библиотеку для преобразования. В комментариях уже упоминалось:

    Instant.ofEpochSecond(timestamp)

При умножении на 1000 работ (в long , а не на int из-за переполнения) выполнение ваших преобразований даты и времени вручную - плохая привычка, потому что они очень часто усложняются, чем вы думаете, и риск ошибок отлично. Кроме того, использование метода библиотеки с хорошим именем намного лучше объясняет, почему вы умножаете на 1000.

3- В других API, таких как Youtube, они используют обычный DateTime, почему Facebook и Imgur меняют их?

Я думаю, это потому, что они не знали лучше, когда разрабатывали API. Существует международный стандарт для передачи даты и времени, ISO 8601, и его эффективное использование предотвращает ошибки, подобные вашей, так что это то, что они должны были использовать. Даже если бы они поняли это позже, сейчас многие программы полагаются на старый способ, поэтому менять его сейчас также будет рискованно.

связи


Есть идеи?

10000