Java time из строки

Java 8 дата и время

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

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

    • java.util.Date — самый древний способ. Большая часть методов отмечена устаревшими, но сам класс до сих пор используется довольно часто.
    • java.util.Calendar — обычно используется совместно с java . util . Date .
    • Пакет java.time — новый способ, сильно превосходит предыдущие по удобству и функционалу, но используется пока не так часто (по крайней мере мне редко приходилось сталкиваться.

    java.util.Date

    Самый древний способ. Если вы посмотрите на описание методов java.util.Date, то вы заметите, что большая часть методов указана устаревшими. Реально полезного и работающего всего чуть-чуть.

    Полезные методы класса java . util . Date :

    Возвращает true , если дата объекта находится позже указанной.

    Возвращает true , если дата объекта находится перед указанной.

    Сравнение дат. Возвращает 0, если даты равны. Возвращает -1, если дата объекта находится до anotherDate . Возвращает 1, если дата объекта позже anotherDate .

    Используются для конвертации в Instant из пакета java . time и обратно.

    Возвращает и устанавливает значение java . util . Date в количестве миллисекунд, прошедших с 1 января 1970 года 00:00 GMT.

    java.util.Calendar

    Класс java.util.Calendar является абстрактным классом. Единственная реализация — java . util . GregorianCalendar . Новый экземпляр создаётся фабричным методом:

    Calendar предоставляет методы установки значений различных полей вроде YEAR , MONTH , DAY_OF_MONTH , HOUR и т. д, манипуляции этими полями, например добавление дня или месяца. Дата и время представляется количеством миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 GMT. Обычно класс java . util . Calendar используется для создания экземпляров java . util . Date , представляющих необходимую дату и время.

    Calendar имеет два режима интерпретации полей: мягкий (lenient) и жёсткий (non-lenient). Когда Calendar в мягком (lenient) режиме, то он принимает больший диапазон значений полей, чем возвращает. Когда Calendar пересчитывает значения полей, возвращаемых get ( ) , то все поля нормализуются. Например, мягкий GregorianCalendar интерпретирует MONTH == JANUARY , DAY_OF_MONTH == 32 как 1 февраля.

    Когда Calendar в жёстком (non-lenient) режиме, то он бросает исключение в подобных случаях. Например, GregorianCalendar всегда возвращает значение поля DAY_OF_MONTH в диапазоне от 1 до длины месяца. Жёсткий GregorianCalendar бросает исключение во время выполнения вычислений своего времени или поля, если хоть одно поле выходит за допустимые границы.

    Устанавливает новое значения поля.

    Возвращает значение поля. Для мягкого режима значения полей нормализуются, а в случае жёсткого режима и выхода значения какого-либо поля за допустимый диапазон бросается исключение

    Добавляет amount (может быть отрицательным) к указанному полю.

    Конвертация в java . util . Date и обратно.

    Устанавливает мягкий (lenient) или жёсткий (non-lenient) режим.

    Конвертирует в Instant из пакета java . time .

    Позволяет установить часовой пояс. По умолчанию используется часовой пояс системы, на которой запущена программа. С помощью этого метода можно указать другой часовой пояс. Например: calender . setTimeZone ( TimeZone . getTimeZone ( «America/Los_Angeles» ) ) ;

    Возвращает часовой пояс, ассоциированный с данным экземпляром Calendar .

    java.time

    Наиболее удобный и современный способ работы с датой и временем. Берёт своё начало от библиотеки Joda-Time.

    Есть два базовых способа представления времени. Один способ представляет время в терминах человека, таких как год, месяц, день, час, минуты и секунды. Второй способ представляет машинное время, измеряя время непрерывно с начала, называемого эпохой, в наносекундах. Пакет Date-Time содержит большое количество классов, представляющий дату и время. Некоторые классы в Date-Time API представляют машинное время, некоторые человеческое.

    Сначала определите, какие аспекты даты и времени вам нужны, затем выберите класс или классы, которые подходят под ваши нужды.

    Например, вы можете выбрать java . time . LocalDate для хранения даты рождения, так как многие люди празднуют день рождения в тот же день, независимо от того, находятся ли они в месте рождения или на другом конце Земли. Если вам нужно астрологическое время, то вы можете использовать java . time . LocalDateTime , чтобы показать дату и день рождения, либо java . time . ZonedDateTime , который дополнительно содержит часовой пояс. Если вы создаёте временную отметку, то вероятнее всего вы захотите использовать java . time . Instant , который позволяет сравнивать одну временную отметку с другой.

    Суммарная таблица классов пакета java . time :

    Класс или перечисление Год Месяц День Часы Минуты Секунды* Смещ. врем. зоны Zone ID toString Output
    Instant x 2013-08-20T15:16:26.355Z
    LocalDate x x x 2013-08-20
    LocalDateTime x x x x x x 2013-08-20T08:16:26.937
    ZonedDateTime x x x x x x x x 2013-08-21T00:16:26.941+09:00[Asia/Tokyo]
    LocalTime x x x 08:16:26.943
    MonthDay x x --08-20
    Year x 2013
    YearMonth x x 2013-08
    Month x AUGUST
    OffsetDateTime x x x x x x x 2013-08-20T08:16:26.954-07:00
    OffsetTime x x x x 08:16:26.957-07:00
    Duration ** ** ** x PT20H (20 hours)
    Period x x x *** *** P10D (10 days)

    * секунды считаются с точностью до наносекунд
    ** Этот класс не сохраняет эту информацию, но имеет методы для получения времени в них.
    *** Когда Period добавляется к ZonedDateTime , то учитывается переход на зимнее/летнее время и отличие локального времени.

    java.time.DayOfWeek

    Перечисление java.time.DayOfWeek состоит из семи констант, описывающих дни недели. Целочисленные значения для констант начинаются с 1 (Понедельник) и заканчиваются 7 (Воскресенье).

    MONDAY (понедельник, 1)
    TUESDAY (вторник, 2)
    WEDNESDAY (среда, 3)
    THURSDAY (четверг, 4)
    FRIDAY (пятница, 5)
    SATURDAY (суббота, 6)
    SUNDAY (воскресенье, 7)

    Вы можете использовать метод public String getDisplayName ( TextStyle style , Locale locale ) для получения названий дней недели в соответствии с региональными настройками пользователя. Перечисление java . time . format . TextStyle позволяет указать тип строки: FULL , NARROW (обычно одна буква), SHORT (аббревиатура).

    Источник

    Parse a String to UTC Date Time

    Learn to convert a string to date time instance classes e.g. ZonedDateTime or OffsetDateTime classes, using DateTimeFormatter class in Java.

    1. Instant, OffsetDateTime and ZonedDateTime Classes

    In Java 8, OffsetDateTime and ZonedDateTime – both store an instant on the universal timeline to nanosecond precision.

    • OffsetDateTime adds to the instant the offset from UTC, which allows the local date-time to be obtained. We can use OffsetDateTime when modeling date-time concepts in more detail, or when communicating to a database or in a network protocol.
    • ZonedDateTime uses full time-zone rules while handling dates. We can use ZonedDateTime for displaying the time in UI. It honors DST (Daylight Saving Time) rules. Remember that zone offset can change for zone id during the DST changes.

    2. Parse String to OffsetDateTime in UTC

    Date time with offset information is represented in any pattern. For example, if we use the pattern «03/08/2019T16:20:17:717+05:30» then this timestamp represents one instant at «+05:30» offset.

    Given below is a Java program to convert string to OffsetDateTime and get an equivalent instant in UTC. It uses the function withOffsetSameInstant(ZoneOffset.UTC) to convert a given instant to UTC instant.

    ‘Z’ in string represents the UTC timezone. It is short form of Zulu and can be written as UTC +0:00 .

    import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; public class Main < public static void main(String[] args) throws Exception < DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter .ofPattern("dd/MM/uuuu'T'HH:mm:ss:SSSXXXXX"); //Date string with offset information String dateString = "03/08/2019T16:20:17:717+05:30"; //Instance with given offset OffsetDateTime odtInstanceAtOffset = OffsetDateTime.parse(dateString, DATE_TIME_FORMATTER); //Instance in UTC OffsetDateTime odtInstanceAtUTC = odtInstanceAtOffset.withOffsetSameInstant(ZoneOffset.UTC); //Formatting to string String dateStringInUTC = odtInstanceAtUTC.format(DATE_TIME_FORMATTER); System.out.println(odtInstanceAtOffset); System.out.println(odtInstanceAtUTC); System.out.println(dateStringInUTC); //Convert OffsetDateTime to instant which is in UTC System.out.println(odtInstanceAtOffset.toInstant()); >>
    2019-08-03T16:20:17.717+05:30 2019-08-03T10:50:17.717Z 03/08/2019T10:50:17:717Z 2019-08-03T10:50:17.717Z

    3. Parse String to ZonedDateTime in UTC

    Date time with full zone information can be represented in the following formats.

    • dd/MM/uuuu’T’HH:mm:ss:SSSXXXXX pattern. e.g. «03/08/2019T16:20:17:717+05:30» .
    • MM/dd/yyyy’T’HH:mm:ss:SSS z pattern. e.g. «08/03/2019T16:20:17:717 UTC+05:30» .

    In this example, timestamp represents one instant at «+05:30» offset i.e. IST.

    Given below is a Java program to convert string to ZonedDateTime and get an equivalent instant in UTC. It uses the withZoneSameInstant(ZoneOffset.UTC) method for getting the instant in UTC zone id.

    import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class Main < public static void main(String[] args) throws Exception < DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter .ofPattern("MM/dd/yyyy'T'HH:mm:ss:SSS z"); //Date string with zone information String dateString = "08/03/2019T16:20:17:717 UTC+05:30"; //Instance with given zone ZonedDateTime zdtInstanceAtOffset = ZonedDateTime.parse(dateString, DATE_TIME_FORMATTER); //Instance in UTC ZonedDateTime zdtInstanceAtUTC = zdtInstanceAtOffset.withZoneSameInstant(ZoneOffset.UTC); //Formatting to string String dateStringInUTC = zdtInstanceAtUTC.format(DATE_TIME_FORMATTER); System.out.println(zdtInstanceAtOffset); System.out.println(zdtInstanceAtUTC); System.out.println(dateStringInUTC); //Convert ZonedDateTime to instant which is in UTC System.out.println(zdtInstanceAtOffset.toInstant()); >>
    2019-08-03T16:20:17.717+05:30[UTC+05:30] 2019-08-03T10:50:17.717Z 08/03/2019T10:50:17:717 Z 2019-08-03T10:50:17.717Z

    Источник

    Convert String to DateTime Object in Java

    Convert String to DateTime Object in Java

    1. Use SimpleDateFormat and java.util.Date to Convert a Date String Into DateTime Object in Java
    2. Use Java 8 Date and Time Library to Convert a Date String Into Date Time Format
    3. Use joda-time to Convert a Date String Into Date Time Format

    This article will introduce how we can convert a given string into a DateTime Object using different approaches and examples.

    Use SimpleDateFormat and java.util.Date to Convert a Date String Into DateTime Object in Java

    SimpleDateFormat is a class used to parse and format a date in locale-sensitive-manner. It allows us to convert a string to DateTime and convert a DateTime object to a string.

    In the below code, we use the string date_time , which is parsed by calling the parse method on the SimpleDateFormat instance dateParser . The format in which we want the string date_time to be parsed is specified inside the SimpleDateFormat constructor.

    We have also created a new instance of the SimpleDateFormat class with a different format. The parsed date is then formatted and printed.

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;  public class StringToDateTime   public static void main(String [] args)   String date_time = "11/27/2020 05:35:00";  SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yy HH:mm:ss");    try   Date date = dateParser.parse(date_time);  System.out.println(date);   SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yy");  System.out.println(dateFormatter.format(date));   > catch (ParseException e)   e.printStackTrace();  >  >  > > 
    Fri Nov 27 05:35:00 UTC 2020 11/27/20 

    Use Java 8 Date and Time Library to Convert a Date String Into Date Time Format

    The LocaleDate class represents a date in ISO format without time. The DateTimeFormatter class is used for parsing dates in different formats. We can provide custom patterns by calling ofPattern() method on DateTimeFormatter .

    LocaleDate has a parse() method, which takes the custom text string and a specific formatter inputFormat to parse and obtain a LocalDate instance. The obtained LocaleDate instance date is then formatted and printed as output.

    import java.time.LocalDate; import java.time.format.DateTimeFormatter;  public class Main   public static void main(String [] args)   DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");   LocalDate date = LocalDate.parse("11/27/2020 05:35:00", inputFormat);   DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");  System.out.println(date.format(outputFormat));  > > 

    Источник

    Читайте также:  Submit post array php
Оцените статью