Как лучше всего преобразовать String
в формате «2 января 2010 года» Date
в Java?
В конечном итоге я хочу выделить месяц, день и год как целые числа, чтобы я мог использовать
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
преобразовать дату во время.
Date
устарели.java.util.Date
,java.util.Calendar
иjava.text.SimpleTextFormat
теперь наследие , вытесняется java.time классов. Смотрите Учебник по Oracle .Ответы:
Это трудный путь, и эти
java.util.Date
методы установки устарели с Java 1.1 (1997). Просто отформатируйте дату,SimpleDateFormat
используя шаблон формата, соответствующий входной строке .В вашем конкретном случае «2 января 2010» в качестве входной строки:
MMMM
шаблон для негоd
для него схему.yyyy
для него схему.Обратите внимание на важность явного
Locale
аргумента. Если вы пропустите его, он будет использовать локаль по умолчанию, которая не обязательно является английской, как используется в названии месяца входной строки. Если языковой стандарт не совпадает с входной строкой, вы можете получить путаницу,java.text.ParseException
даже если шаблон формата кажется действительным.Вот выдержка из Javadoc , в которой перечислены все доступные шаблоны форматов:
Обратите внимание, что шаблоны чувствительны к регистру и текстовые шаблоны из четырех или более символов представляют полную форму; в противном случае используется короткая или сокращенная форма, если таковая имеется. Так, например,
MMMMM
или больше не нужно.Вот несколько примеров допустимых
SimpleDateFormat
шаблонов для анализа данной строки на сегодняшний день:Важным примечанием является то, что не
SimpleDateFormat
является потокобезопасным. Другими словами, вы никогда не должны объявлять и назначать его как статическую переменную или переменную экземпляра, а затем повторно использовать его из разных методов / потоков. Вы всегда должны создавать его совершенно новым в рамках локальной области метода.Обновление Java 8
Если вы используете Java 8 или новее, используйте
DateTimeFormatter
(также здесь, нажмите на ссылку, чтобы увидеть все предопределенные форматеры и доступные шаблоны форматов; руководство доступно здесь ). Этот новый API вдохновлен JodaTime .Примечание: если ваш шаблон формата также содержит часть времени, используйте
LocalDateTime#parse(text, formatter)
вместоLocalDate#parse(text, formatter)
. И, если ваш шаблон формата также содержит часовой пояс, используйтеZonedDateTime#parse(text, formatter)
вместо этого.Вот выдержка из Javadoc , в которой перечислены все доступные шаблоны форматов:
Обратите внимание, что у него есть несколько предопределенных форматеров для более популярных шаблонов. Таким образом, вместо, например
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, вы можете использоватьDateTimeFormatter.RFC_1123_DATE_TIME
. Это возможно, потому что они, напротивSimpleDateFormat
, потокобезопасны. Таким образом, вы также можете определить свой собственный, если это необходимо.Для конкретного формата входной строки вам не нужно использовать явное
DateTimeFormatter
: стандартную дату ISO 8601 , например 2016-09-26T17: 44: 57Z, можно анализировать напрямую, такLocalDateTime#parse(text)
как она уже используетISO_LOCAL_DATE_TIME
форматтер. Точно так жеLocalDate#parse(text)
анализирует дату ISO без компонента времени (см.ISO_LOCAL_DATE
) ИZonedDateTime#parse(text)
анализирует дату ISO с добавлением смещения и часового пояса (см.ISO_ZONED_DATE_TIME
).источник
O
, как позволить ему печататьUTC+08:00
вместоGMT+08:00
. Я не мог получить ни одного примера.20-JUN-16 12.00.00.000000000 AM
, нужна помощь, чтобы преобразовать это в дату. Ваша помощь очень ценится!Ах да, обсуждение Java Date, опять же. Для работы с датами мы используем Date , Calendar , GregorianCalendar и SimpleDateFormat . Например, используя вашу дату января в качестве входных данных:
Тогда вы можете манипулировать этим с чем-то вроде:
источник
источник
С Java 8 мы получаем новый API Date / Time ( JSR 310 ).
Следующий способ можно использовать для разбора даты в Java 8, не полагаясь на Joda-Time :
LocalDate - это стандартный класс Java 8 для представления даты (без времени). Если вы хотите проанализировать значения, которые содержат информацию о дате и времени, вы должны использовать LocalDateTime . Для значений с часовыми поясами используйте ZonedDateTime . Оба предоставляют
parse()
метод, похожий наLocalDate
:Список символов форматирования из Javadoc DateTimeFormatter :
источник
Хотя некоторые ответы технически правильны, они не рекомендуются.
Эта популярная бесплатная библиотека с открытым исходным кодом может использоваться в нескольких версиях Java. Многие примеры его использования можно найти в StackOverflow. Чтение некоторых из них поможет вам быстро освоиться.
Этот новый набор классов основан на Joda-Time и определен JSR 310. Эти классы встроены в Java 8. В настоящее время ведется проект по переносу этих классов на Java 7, но эта обратная порция не поддерживается Oracle.
Дата имеет как часть даты, так и часть времени суток)
Начало дня зависит от часового пояса. Если вам не удается указать часовой пояс, применяется часовой пояс JVM по умолчанию. Это означает, что поведение вашего кода может измениться при запуске на других компьютерах или с измененной настройкой часового пояса. Наверное, не то, что вы хотите.
Locale определяет, как интерпретировать слова (название месяца и дня), встречающиеся при разборе. ( Ответ BalusC обрабатывает это правильно.) Кроме того, Locale влияет на вывод некоторых форматеров при генерации строкового представления вашей даты и времени.
Joda времени
Далее следует несколько заметок о Joda-Time.
Часовой пояс
В Joda-Time , DateTime объект действительно знает свой назначенный часовой пояс. Это контрастирует с классом java.util.Date, который, кажется, имеет часовой пояс, но не имеет.
Обратите внимание на пример кода ниже, как мы передаем объект часового пояса в средство форматирования, которое анализирует строку. Этот часовой пояс используется для интерпретации даты и времени как произошедших в этом часовом поясе. Поэтому вам нужно подумать и определить часовой пояс, представленный этой строковой информацией.
Поскольку у вас нет временной части во входной строке, Joda-Time назначает первый момент дня указанного часового пояса как время дня. Обычно это означает,
00:00:00
но не всегда, из-за перехода на летнее время (DST) или других аномалий. Кстати, вы можете сделать то же самое с любым экземпляром DateTime, вызвавwithTimeAtStartOfDay
.Шаблон форматирования
Символы, используемые в шаблоне форматера, похожи в Joda-Time на символы в java.util.Date/Calendar, но не совсем такие же. Внимательно прочитайте документацию.
неизменность
Мы обычно используем неизменяемые классы в Joda-Time. Вместо того, чтобы модифицировать существующий объект Date-Time, мы вызываем методы, которые создают новый свежий экземпляр на основе другого объекта с большинством скопированных аспектов, за исключением тех случаев, когда изменения были желательны. Примером является вызов
withZone
в последней строке ниже. Неизменяемость помогает сделать Joda-Time очень поточно-ориентированным, а также сделать работу более понятной.преобразование
Вам понадобятся объекты java.util.Date для использования с другими классами / фреймворками, которые не знают об объектах Joda-Time. К счастью, это очень легко двигаться вперед и назад.
Переход от объекта java.util.Date (здесь названного
date
) к Joda-Time DateTime…Переход в другом направлении от Joda-Time к объекту java.util.Date…
Образец кода
Когда беги…
источник
При работе с классом SimpleDateFormat важно помнить, что Date не является потокобезопасным, и вы не можете совместно использовать один объект Date с несколькими потоками.
Также есть большая разница между «m» и «M», где регистр используется для минут, а прописной - для месяца. То же самое с "D" и "D". Это может вызвать незначительные ошибки, которые часто упускаются из виду. См. Javadoc или Руководство по Преобразованию Строки в Дату в Java для получения дополнительной информации.
источник
Он отлично работает для меня.
источник
Вы можете использовать SimpleDateformat для изменения строки на дату
источник
Кроме того, SimpleDateFormat недоступен для некоторых технологий на стороне клиента, таких как GWT .
Рекомендуется использовать Calendar.getInstance (), и вам необходимо сравнить две даты; пойти на длинное свидание.
источник
Мы использовали два простых средства форматирования:
Мы анализируем полный формат даты и времени:
источник
Моя скромная тестовая программа. Я использую его, чтобы поиграться с форматером и посмотреть длинные даты, которые я нахожу в лог-файлах (но кто их там поместил ...).
Моя тестовая программа:
Результаты теста:
источник
Ссылка на источник
Для Android
Calendar.getInstance (). GetTime () дает
использование
источник
Преобразование строки в дату:
источник
Попробуй это
источник