Разбор строки даты и времени в объекте ZonedDateTime - PullRequest
2 голосов
/ 09 марта 2019

Я пытаюсь проанализировать строку с датой и временем в известном часовом поясе. Строки имеют следующий формат:

2019-03-07 00:05:00-05:00

Я пробовал это:

package com.example.test;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Test {

    public static void main( String[] args ) {

        ZoneId myTimeZone = ZoneId.of("US/Eastern");

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ssXX");

        ZonedDateTime zdt = ZonedDateTime.parse("2019-03-07 00:05:00-05:00", dateTimeFormatter.withZone(myTimeZone));

        System.out.println(zdt);

    }

}

Это исключение:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-03-07 00:05:00-05:00' could not be parsed at index 19
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at com.example.test.Test.main(Test.java:24)
C:\Users\user\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

Я использую Java 1.8.0_191.

Ответы [ 2 ]

4 голосов
/ 09 марта 2019

tl; др

OffsetDateTime.parse( 
    "2019-03-07 00:05:00-05:00".replace( " " , "T" ) 
)

Используйте смещение, Люк

Вам не нужен часовой пояс.Ваша строка содержит смещение от UTC на пять часов позже UTC.Это говорит нам о конкретном моменте, точке на временной шкале.

ISO 8601

Замените этот ПРОБЕЛ в середине ввода на T, чтобы соответствовать ISO 8601. Классы java.time используют стандартные форматы:дефолт.Поэтому нет необходимости указывать шаблон форматирования.

OffsetDateTime

Анализировать как OffsetDateTime.

String input = "2019-03-07 00:05:00-05:00".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

ZonedDateTime

Если вы точно знаете, что это значение предназначалось дляопределенный часовой пояс, вы можете применить ZoneId, чтобы получить ZonedDateTime.

Имейте в виду, что US/Eastern является устаревшим как имя часового пояса .Современный подход Continent/Region.Возможно, вы имеете в виду America/New_York.

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
4 голосов
/ 09 марта 2019

Используйте этот шаблон: yyyy-MM-dd HH:mm:ssXXX

Из документов :

Смещение X и x: ... Две буквы выводят часы и минутыбез двоеточия, например «+0130».Три буквы выводят час и минуту с двоеточием, например, «+01: 30».

Так что, если ваша строка содержит двоеточие внутри часового пояса, вы должны использовать 3 «X-es».

А заглавная Y означает "недельный год", а не обычный (y).

...