Что это за формат даты и времени? Как преобразовать его в удобочитаемый вывод? Почему он возвращает этот вывод? - PullRequest
0 голосов
/ 25 марта 2020

Я разрабатываю приложение 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 ]

2 голосов
/ 25 марта 2020

Ваше 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 часовом поясе

1 голос
/ 25 марта 2020

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

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

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

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

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

    Instant.ofEpochSecond(timestamp)

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

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

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

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...