Конвертировать строку в java.util.Date - PullRequest
29 голосов
/ 29 апреля 2010

Я храню даты в базе данных 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);

Что я делаю не так?

Ответы [ 4 ]

55 голосов
/ 29 апреля 2010

Я думаю, что ваш формат даты не имеет смысла. Там нет 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);

На нем напечатано «Чт 29 апреля 13:00:14 CEST 2010».

5 голосов
/ 29 апреля 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");

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

2 голосов
/ 29 апреля 2010

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

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

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 - для часов в пределах AM или PM, с 01 по 12, поэтому потребуется маркер AM / PM.

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

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

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

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

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

Ссылки

...