Конвертировать строку в java.util.date
-
02-10-2019 - |
Вопрос
Я храним даты в базе данных 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
с подпаками.
Ссылки
- Оракул Учебник: дата времени Объясняя, как использовать
java.time
. - Запрос спецификации Java (JSR) 310, куда
java.time
был впервые описан. - Проект Backport Threeten Backport, задница
java.time
к Java 6 и 7 (Threeten для JSR-310). - Threetenabp., Android Edition Threeten Backport
- Вопрос: Как использовать THRETENABP в Android Project, с очень тщательным объяснением.
- Статья Wikipedia: ISO 8601