Top-office11.ru

IT и мир ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java преобразовать строку в дату

Преобразование строки Java в дату

766 littleK [2010-11-18 18:53:00]

Каков наилучший способ преобразования String в формате «2 января 2010» в Date на Java?

В конечном счете, я хочу разбить месяц, день и год как целые числа, чтобы я мог использовать

для преобразования даты во времени.

java string date time data-conversion

14 ответов

1476 Решение BalusC [2010-11-18 18:55:00]

В вашем конкретном случае «2 января 2010 года» в качестве входной строки:

  1. «Январь» — полный текстовый месяц, поэтому используйте шаблон MMMM для него
  2. «2» — короткий день месяца, поэтому используйте для него шаблон d .
  3. «2010» — это 4-значный год, поэтому используйте шаблон yyyy для него.

Обратите внимание на важность явного аргумента Locale . Если вы опустите его, то он будет использовать языковой стандарт по умолчанию, который не обязательно является английским, как используется в имени месяца входной строки. Если языковой стандарт не совпадает с входной строкой, вы можете смутно получить java.text.ParseException даже если шаблон формата кажется действительным.

Здесь выдержка, относящаяся к javadoc, перечисляющая все доступные шаблоны формата:

Обратите внимание, что шаблоны чувствительны к регистру и что текстовые шаблоны из четырех символов или более представляют собой полную форму; в противном случае используется короткая или сокращенная форма. Так что, например, MMMMM или более нет необходимости.

Вот несколько примеров правильных шаблонов SimpleDateFormat для синтаксического анализа данной строки на сегодняшний день:

Важно отметить, что SimpleDateFormat не является потокобезопасным. Другими словами, вы никогда не должны объявлять и назначать его как статическую или экземплярную переменную, а затем повторно использовать ее из разных методов/потоков. Вы всегда должны создавать его совершенно в рамках локального метода метода.

Обновление Java 8

Если вы находитесь на Java 8 или новее, используйте DateTimeFormatter (также здесь, щелкните ссылку, чтобы увидеть все предопределенные форматы и доступные шаблоны формата, здесь доступно учебное пособие). Этот новый API вдохновлен JodaTime.

Здесь выдержка, относящаяся к 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 ).

63 pn1 dude [2010-11-19 06:27:00]

А да обсуждение Java Date снова. Чтобы справиться с обработкой даты, мы используем Date, Calendar, GregorianCalendar и SimpleDateFormat. Например, используя вашу январскую дату в качестве ввода:

Тогда вы можете манипулировать этим с помощью чего-то вроде:

34 micha [2014-03-04 21:56:00]

С Java 8 мы получаем новый API даты/времени (JSR 310).

Следующий способ можно использовать для разбора даты в Java 8, не полагаясь на Joda-Time:

//если мы 2-й, даже если мы изменили в шаблоне, и это не работает, пожалуйста, тренировка с 2-ым DateTimeFormatter formatter = DateTimeFormatter.ofPattern(«MMMM Q, yyyy», Locale.ENGLISH); LocalDate date = LocalDate.parse(str, formatter);

LocalDate — это стандартный класс Java 8 для представления даты (без времени). Если вы хотите проанализировать значения, которые содержат информацию о дате и времени, вы должны использовать LocalDateTime. Для значений с часовыми поясами используйте ZonedDateTime. Оба предоставляют метод parse() аналогичный LocalDate :

Список символов форматирования из Javadoc DateTimeFormatter:

Хотя некоторые из ответов являются технически правильными, они нецелесообразны.

  • Классы java.util.Date и Calendar, как известно, являются неприятными. Из-за недостатков в дизайне и реализации избегайте их. К счастью, у нас есть выбор из двух отличных библиотек времени:
    • Joda-Time
      Эта популярная бесплатная библиотека с бесплатными затратами может использоваться через несколько версий Java. Многие примеры его использования можно найти в StackOverflow. Чтение некоторых из них поможет вам быстро ускорить работу.
    • java.time. * package
      Этот новый набор классов вдохновлен Joda-Time и определяемый JSR 310. Эти классы встроены в Java 8. В настоящее время выполняется проект по резервному копированию этих классов на Java 7, но этот backporting не поддерживается Oracle.
  • Как правильно заметил Кристофер Джонсон в своем комментарии к этому вопросу, другие ответы игнорируют жизненно важные вопросы:
    • Время суток
      Дата имеет как часть даты, так и часть времени дня.
    • Часовой пояс
      Начало дня зависит от часового пояса. Если вы не указали часовой пояс, применяется часовой пояс JVM по умолчанию. Это означает, что поведение вашего кода может измениться при запуске на других компьютерах или с измененной настройкой часового пояса. Наверное, не то, что вы хотите.
    • Язык. Язык Locale указывает, как интерпретировать слова (имя месяца и дня), встречающиеся во время разбора. (ответ BalusC обрабатывает это правильно.) Кроме того, Locale влияет на вывод некоторых форматировщиков при создании строкового представления вашей даты-времени.
Читать еще:  Enum valueof java

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.утиль.Дата в строку

Я хочу, чтобы преобразовать java.util.Date объект a String в Java.

формат 2010-05-30 22:15:52

16 ответов:

в Java преобразуйте дату в строку, используя строку формата:

Commons-lang DateFormatUtils полон вкусностей (если у вас есть commons-lang в вашем classpath)

tl; dr

java.время

современный способ с java.классы времени, которые теперь вытесняют проблемные старые устаревшие классы даты-времени.

сначала преобразуйте ваш java.util.Date до Instant . Элемент Instant класс представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) знаков после запятой фракция.)

преобразования в / из java.время выполняется новыми методами, добавленными к старым классам.

обоих java.util.Date и java.time.Instant в UTC. Если вы хотите видеть дату и время в формате UTC, так тому и быть. Звоните toString чтобы создать строку в стандарте ISO 8601.

для других форматов, вам нужно преобразовать ваш Instant в тем более гибкий OffsetDateTime .

чтобы получить строку в нужном формате, укажите DateTimeFormatter . Вы можете указать пользовательский формат. Но я бы использовал один из предопределенных форматеров ( ISO_LOCAL_DATE_TIME ), и заменить T в его выводе с пробелом.

кстати я не рекомендую такой формат, где вы намеренно теряете смещение от UTC или информация о часовом поясе. Создает двусмысленность относительно значения даты-времени этой строки.

также остерегайтесь потери данных, так как любая дробная секунда игнорируется (эффективно усекается) в представлении вашей строки значения даты-времени.

чтобы увидеть тот же самый момент через объектив какого-то конкретного регион времени применить ZoneId и ZonedDateTime .

нмв.метод toString(): 2014-11-14T14:05:09-05:00[Америка/Монреале]

чтобы создать форматированную строку, сделайте то же самое, что и выше, но замените odt С zdt .

при выполнении этого кода очень большое количество раз, вы можете быть немного более эффективным и избежать звонок в String::replace . Снижается, что также делает ваш код короче. Если это необходимо, укажите свой собственный шаблон форматирования в своем собственном . Кэшируйте этот экземпляр как константу или элемент для повторного использования.

примените этот форматер, передав экземпляр.

о java.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date , .Calendar ,& java.text.SimpleDateFormat .

дополнительные сведения см. В разделе элемент Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений.

большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптируется к Android in ThreeTenABP (см. как использовать. ).

The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время.

Альтенативные однострочные в простой старой java:

использует форматер и относительный индексации вместо SimpleDateFormat что это не потокобезопасна, кстати.

немного более повторяющиеся, но нуждается только в одном заявлении. Это может быть удобно в некоторых случаях.

почему бы вам не использовать Joda (org.Джода.время.DateTime)? Это в основном один лайнер.

Читать еще:  Java regexp substring

16. Java — Дата и время

Java предоставляет класс Date, который доступен в пакете java.util, этот класс заключает в себе текущую дату и время.

Содержание

Конструкторы

Класс Date поддерживает два конструктора, которые показаны ниже.

Конструктор и описание
1Date()
Этот конструктор инициализирует объект с текущей датой и временем.
2Date(long millisec)
Этот конструктор принимает аргумент равный числу миллисекунд, истекших с полуночи 1 января 1970 г.

Методы класса Date

Ниже представлены методы класса Date.

Методы с описанием
1boolean after(Date date)
Возвращает значение true, если вызывающий объект date содержит дату, которая раньше заданной даты, в противном случае он возвращает значение false.
2boolean before(Date date)
Возвращает значение true, если вызывающий объект date содержит дату, более раннюю, чем заданная дата, в противном случае он возвращает значение false.
3Object clone()
Дублирование вызывающего объекта date.
4int compareTo(Date date)
Сравнивает значение вызывающего объекта с этой датой. Возвращает 0, если значения равны. Возвращает отрицательное значение, если объект вызова является более ранним, чем дата. Возвращает положительное значение, если объект вызова позже даты.
5int compareTo(Object obj)
Работает точно так же compareTo(Date), если объект вызова имеет класс Date. В противном случае вызывает ClassCastException.
6boolean equals(Object date)
Возвращает значение true, если вызывающий объект date содержит то же время и дату, которая указана в date, в противном случае он возвращает значение false.
7long getTime()
Возвращает количество миллисекунд, истекших с 1 января 1970 года.
8int hashCode()
Возвращает хэш-код для вызывающего объекта.
9void setTime(long time)
Задает дату и время, соответствующие моменту времени, что представляет собой общее затраченное время в миллисекундах от полуночи 1 января 1970 года.
10String toString()
Преобразует вызывающий объект date в строку и возвращает результат.

Текущая дата и время в Java

Получить текущую дату и время в Java достаточно не трудно. Вы можете использовать простой объект date вместе с методом toString(), чтобы вывести текущую дату и время следующим образом:

Получим следующий результат:

Сравнение дат

Существуют три способа в Java сравнить даты:

  • Можно использовать функцию getTime(), чтобы получить количество миллисекунд, прошедших с момента полуночи 1 января 1970, для обоих объектов, а затем сравнить эти два значения.
  • Вы можете использовать методы before(), after() и equals(). Поскольку 12 число месяца раньше 18 числа, например, new Date(99, 2, 12).before(new Date (99, 2, 18)) возвращает значение true.
  • Можно использовать метод compareTo(), который определяется сопоставимым интерфейсом и реализуется по дате.

Форматирование даты с помощью SimpleDateFormat

SimpleDateFormat — это конкретный класс для парсинга и форматирования даты в Java. SimpleDateFormat позволяет начать с выбора любых пользовательских шаблонов для форматирования даты и времени. Например:

Получим следующий результат:

Формат-коды SimpleDateFormat

Для того, чтобы задать в Java формат даты и времени, используйте строковый шаблон (регулярные выражения) с датой и временем. В этой модели все буквы ASCII зарезервированы как шаблон письма, которые определяются следующим образом:

СимволОписаниеПример
GОбозначение эрын.э.
yГод из четырех цифр2016
MНомер месяца года11
dЧисло месяца13
hФормат часа в A.M./P.M.(1

12)

7
HФормат часа(0

23)

19
mМинуты30
sСекунды45
SМиллисекунды511
EДень неделиВс
DНомер дня в году318
FНомер дня недели в месяце2 (второе воскресение в этом месяце)
wНомер неделя в году46
WНомер недели в месяце2
aМаркер A.M./P.M.AM
kФормат часа(1

24)

24
KФормат часа в A.M./P.M.(0

11)

zЧасовой поясFET (Дальневосточноевропейское время)
Выделение для текстаТекст
»Одинарная кавычка

Форматирование даты с помощью printf

Формат даты и времени можно сделать без труда с помощью метода printf. Вы используете формат двух букв, начиная с t и заканчивая одним из символов в таблице, приведенных ниже. Например:

Получим следующий результат:

Было бы немного глупо, если Вы должны были бы поставить дату несколько раз для форматирования каждой части. По этой причине формат строки может указывать индекс аргумента для форматирования.

Индекс должен непосредственно следовать за % и завершаться $. Например:

Преобразовать строку в дату в Java

1. Обзор

В этом руководстве мы рассмотрим несколько способов преобразования String объектов в Date объекты . Мы начнем с нового API Date Timejava.time , который был представлен в Java 8, а затем рассмотрим старый тип данных java.util.Date , также используемый для представления дат.

В заключение мы также рассмотрим некоторые внешние библиотеки для преобразования с использованием Joda-Time и класса Apache Commons Lang DateUtils .

2. Преобразование String в LocalDate или LocalDateTime

неизменяемые объекты даты и времени, которые представляют дату, а затем дату и время. По умолчанию даты Java представлены в формате ISO-8601, поэтому, если у нас есть какая-либо строка, представляющая дату и время в этом формате, мы можем напрямую использовать API-интерфейс parse () этих классов .

ссылка:/java-8-date-time-intro[Здесь]немного подробнее об этом новом API.

2.1. Использование API Parse

T Чтобы преобразовать объекты String в объекты LocalDate и LocalDateTime , String должна представлять действительную дату или время в соответствии с https://docs.oracle.com/javase/8/docs/api/java/time/format/ . DateTimeFormatter.html # ISO LOCAL DATE[ISO LOCAL DATE]или https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO LOCAL DATE TIME[ISO LTALEDATE.

В противном случае DateTimeParseException будет выброшено во время выполнения.

В нашем первом примере давайте преобразуем строку в java.time.LocalDate:

Подход, аналогичный описанному выше, можно использовать для преобразования String в java.time . LocalDateTime :

Важно отметить, что объекты LocalDate и LocalDateTime не зависят от часового пояса. Однако когда нам нужно иметь дело с конкретной датой и временем для часового пояса, мы можем напрямую использовать метод ZonedDateTime parse , чтобы получить дату и время для определенного часового пояса:

Теперь давайте посмотрим, как мы конвертируем строки в произвольном формате.

2.2. Использование API Parse с пользовательским форматером

Преобразование String с пользовательским форматом даты в объект Date является широко распространенной операцией в Java.

Для этого мы будем использовать класс DateTimeFormatter , который предоставляет множество предопределенных форматеров и позволяет нам определять форматер.

Давайте начнем с примера использования одного из предопределенных форматеров DateTimeFormatter :

В следующем примере давайте создадим форматтер, который применяет формат «EEE, MMM d yyyy». Этот формат определяет три символа для полного имени дня недели, одну цифру для обозначения дня месяца, три символа для представления месяца и четыре цифры для представления года.

Этот форматер распознает такие строки, как « Fri, 3 января 2003 ′ ′» или «Wed, 23 Mar 1994 »:

2.3. Общие шаблоны даты и времени

Давайте посмотрим на некоторые общие шаблоны даты и времени:

M – Месяц в году (июль; июль; 07)

d — День в месяце (1-31)

E — Название дня в неделе (пятница, воскресенье)

a Am/pm маркер (AM, PM)

H — час в день (0-23)

h — час в час/час (1-12)

m — минута в часе (0-60)

s — секунда в минуте (0-60)

Для получения полного списка символов, который мы можем использовать для указания шаблона для анализа, нажмите here .

Если нам нужно преобразовать java.time даты в более старый объект java.util.Date , прочитайте ссылку:/java-date-to-localdate-and-localdatetime[this]для получения более подробной информации.

3. Преобразование String в java.util.Date

До Java 8 механизм даты и времени Java предоставлялся старыми API-интерфейсами классов java.util.Date , java.util.Calendar и java.util.TimeZone ** , с которыми иногда нам все еще нужно работать.

Давайте посмотрим, как преобразовать строку в объект java.util.Date :

В приведенном выше примере сначала нам нужно создать объект SimpleDateFormat , передав шаблон, описывающий формат даты и времени.

Далее нам нужно вызвать метод parse () , передав дату String .

Если переданный аргумент String не имеет тот же формат, что и шаблон, то будет выброшено ParseException .

3.1. Добавление информации о часовом поясе в java.util.Date

Важно отметить, что java.util.Date не имеет понятия часового пояса ** и представляет только количество секунд, прошедших с начала эпохи Unix — 1970-01-01T00: 00: 00Z.

Но когда мы печатаем объект Date напрямую, он всегда будет печататься с системным часовым поясом Java по умолчанию.

В этом последнем примере мы рассмотрим, как форматировать дату, добавляя информацию о часовом поясе:

Мы также можем программно изменить часовой пояс JVM, но это не рекомендуется:

4. Внешние библиотеки

Теперь, когда мы хорошо понимаем, как преобразовать объекты String в объекты Date с помощью новых и старых API, предлагаемых базовой Java, давайте рассмотрим некоторые внешние библиотеки.

4.1. Joda-Time Library

Альтернативой базовым библиотекам Java Date и Time является Joda-Time . Хотя авторы теперь рекомендуют пользователям перейти на java.time (JSR-310), если это невозможно, библиотека Joda-Time предоставляет отличную альтернативу для работы с датой и временем . Эта библиотека предоставляет практически все возможности, поддерживаемые в проекте Java 8 Date Time .

Артефакт можно найти по адресу Maven Central :

Вот быстрый пример работы со стандартным DateTime :

Давайте также посмотрим пример явной установки часового пояса:

4.2. Apache Commons Lang — DateUtils

Класс DateUtils предоставляет множество полезных утилит, облегчающих работу с устаревшими объектами Calendar и Date .

Артефакт commons-lang3 доступен по адресу Maven Central :

Давайте преобразуем дату String с помощью Array шаблонов дат в java.util.Date

5. Вывод

В этой статье мы проиллюстрировали несколько способов преобразования строк в различные типы объектов Date (со временем и без него), как в простой Java, так и с использованием внешних библиотек.

Полный исходный код статьи доступен на over на GitHub .

Ссылка на основную публикацию
Adblock
detector