Вопрос

Я храним даты в базе данных SQLite в этом формате:

d-MMM-yyyy,HH:mm:ss aaa

Когда я получу дату с этим форматом, я получаю все в порядке, кроме часа. Час всегда 00. Отказ Вот мой выход:

String date--->29-Apr-2010,13:00:14 PM
After convrting Date--->1272479414000--Thu Apr 29 00:00:14 GMT+05:30 2010

Вот код:

    Date lScheduledDate = CalendarObj.getTime();
    DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    SomeClassObj.setTime(formatter.format(lScheduledDate));

    String lNextDate = SomeClassObj.getTime();
    DateFormat lFormatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
    Date lNextDate = (Date)lFormatter.parse(lNextDate);
    System.out.println("output here"+lNextDate);

Что я делаю неправильно?

Это было полезно?

Решение

Я думаю, что ваш формат даты не имеет смысла. 13:00 вечера нет 13:00. Удалите «AAA» в конце вашего формата или поверните HH в HH.

Тем не менее, это работает нормально для меня:

String testDate = "29-Apr-2010,13:00:14 PM";
DateFormat formatter = new SimpleDateFormat("d-MMM-yyyy,HH:mm:ss aaa");
Date date = formatter.parse(testDate);
System.out.println(date);

Он печатает «Thu 29 13:00:14 Cest 2010».

Другие советы

Похоже, вы можете использовать что-то вроде SimpleDateFormat.http://java.sun.com/j2se/1.4.2/docs/api/java/text/simpledateformat.html.

Вы объявляете свой формат даты, а затем вызовите метод анализа со своей строкой.

private static final DateFormat DF = new SimpleDateFormat(...);
Date myDate = DF.parse("1234");

И как говорит Гийом, настаивает часовой пояс!

Вы должны установить TimeZone в своем DatationFormat, в противном случае он будет использовать один по умолчанию (в зависимости от настроек компьютера).

Java.Time.

В то время как в 2010 году, java.util.Date был классом, который мы все использовали (томированные DateFormat а также Calendar) Эти классы всегда были плохо спроектированы и теперь давно устарели. Сегодня один будет использовать Java.time, современную дату и время времени Java.

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy,HH:mm:ss");

        String dateTimeStringFromSqlite = "29-Apr-2010,13:00:14";
        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStringFromSqlite, formatter);
        System.out.println("output here: " + dateTime);

Вывод:

Вывод здесь: 2010-04-29T13: 00: 14

Что пошло не так в вашем коде?

Комбинация прописных букв HH а также aaa В вашем формате шаблоны строки не имеют большого смысла, поскольку HH в течение часа дня, рендеринг маркера AM / PM от aaa лишнее. Это не должно делать никакого вреда, хотя я не мог воспроизвести точные результаты, которые вы сообщили. В любом случае ваш комментарий к тому, что независимо от того, он использует старомодный SimpleDateFormat или современный DateTimeFormatter:

«AAA» не следует использовать, если вы используете «AAA», то уточните «HH»

Нижний регистр hh в течение часа в пределах утра или вечера, от 01 до 12, поэтому потребуется маркер AM / PM.

Другие советы

  • В вашей базе данных, поскольку я понимаю, что SQLite не имеет встроенного типа DateTime, используйте стандартный формат ISO 8601 и время хранения в UTC, например, 2010-04-29T07:30:14Z (современный Instant Таблица классов и форматы таких строк, как его по умолчанию, то есть без какого-либо явного формата).
  • Не используйте смещение, такое как GMT+05:30 для часового пояса. Предпочитаю зону реального часа, например Asia / Colombo, Asia / Kolkata или America / New_york.
  • Если вы хотели использовать устаревшие DateFormat, это parse Метод возвращает A. Date, так что вам не нужен актерский Date lNextDate = (Date)lFormatter.parse(lNextDate);.

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

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

  • В Java 8 а позже и на новых устройствах Android (от API Уровень 26) Современная API наступает встроен.
  • В Java 6 и 7 получают Backport Threeten, Backport современных классов (Threeten для JSR 310; см. Ссылки внизу).
  • В (более старый) Android используйте Android Edition Threeten Backport. Это называется Threetenabp. И убедитесь, что вы импортируете дату и классы времени от org.threeten.bp с подпаками.

Ссылки

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top