Date.getTime () возвращает предыдущий день - PullRequest
0 голосов
/ 13 февраля 2019

Я анализирую дату в формате dd-MM-yyyy и возвращаюсь в секундах (делив ее на 1000).Проблема возникает, когда я конвертирую его в Unix Time Stamp, потому что он конвертирует эти секунды в предыдущий день.Я объясню своим кодом и примером:

private fun String.toTimestamp(): String {
    val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale.getDefault())
    return (dateFormat.parse(this).time / 1000).toString
}

Если дата 01/02/2019 (2 февраля 2019 г.), этот метод возвращает 1548975600.Если вы конвертируете его в дату (я использую эту страницу), она возвращает 01/31/2019 @ 11:00pm (UTC).Я попытался добавить часы, минуты и секунды, даже добавив часовой пояс, но он всегда возвращает день назад.

Другой пример: 13-02-2019> 1550012400> 02/12/2019 @ 11:00pm (UTC)

Дата взята из DatePicker, но если я создаю ее следующим образом, она возвращает правильный день:

(Date().time / 1000).toString()

Я пробовал с языком системы на испанском и английском языках и менялLocale до Locale.ENGLISH и Locale("es", "ES") и результаты совпадают.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

java.time и ThreeTenABP

В синтаксисе Java:

private static final DateTimeFormatter dateFormatter
        = DateTimeFormatter.ofPattern("dd-MM-uuuu");

public static final String toTimestamp(String dateString) {
    long epochSecond = LocalDate.parse(dateString, dateFormatter)
            .atStartOfDay(ZoneOffset.UTC)
            .toEpochSecond();
    return String.valueOf(epochSecond);
}

Давайте попробуем:

    System.out.println(toTimestamp("13-02-2019"));

1550016000

Проверьте это значение в Преобразователе меток времени Unix * Epoch , с которым вы связались:

02/13/2019 @ 12:00 (UTC)

SimpleDateFormat общеизвестно хлопотно и наряду с Date давно устарело.Вместо этого я использую java.time, современный Java API даты и времени.Это заставляет нас явно указывать часовой пояс или смещение.В этом случае в качестве предопределенной константы ZoneOffset.UTC.Что, в свою очередь, гарантирует, что мы получим правильный результат и тем самым решит вашу проблему.Еще одним незначительным преимуществом является то, что он дает нам секунд с той эпохи, поэтому нам не нужно смешное на 1000 деление.

Импорт, который я использовал, был:

import org.threeten.bp.LocalDate;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.format.DateTimeFormatter;

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) современный встроенный API.В этом случае импортируйте из пакета java.time (не org.threeten.bp).
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки навнизу).
  • На более старых версиях Android используется Android-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 13 февраля 2019
//convert seconds to date try below function
public static String convertSecondsToDate(Long date) {
    try {
        long dateInMiliseconds = date *1000;
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(dateInMiliseconds);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return simpleDateFormat.format(calendar.getTime());
    } catch (Exception e) {
        return "";
    }
}
...