source

날짜 문자열을 java.util로 구문 분석할 때 패턴 문자 'T'가 잘못되었습니다.날짜.

factcode 2022. 8. 18. 23:25
반응형

날짜 문자열을 java.util로 구문 분석할 때 패턴 문자 'T'가 잘못되었습니다.날짜.

날짜 문자열이 있으며 Java Date API를 사용하여 정상 날짜로 해석하고 싶습니다.다음은 제 코드입니다.

public static void main(String[] args) {
    String date="2010-10-02T12:23:23Z";
    String pattern="yyyy-MM-ddThh:mm:ssZ";
    SimpleDateFormat sdf=new SimpleDateFormat(pattern);
    try {
        Date d=sdf.parse(date);
        System.out.println(d.getYear());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

. 그것은 바로 '불법천지'이다.java.lang.IllegalArgumentException: Illegal pattern character 'T'

그럼 스트링을 분할해서 수동으로 해석해야 하나요?

덧붙여서, T의 양쪽에 작은 따옴표를 붙이려고 했습니다.

String pattern="yyyy-MM-dd'T'hh:mm:ssZ";

또, 동작하지 않습니다.

Java 8 이상용 업데이트

할 수 요.Instant.parse("2015-04-28T14:23:38.521Z"). '아까운 건'을. 특히나 당신이 사용하셔야 할 때는Instant '부러진' java.util.Date자바어

사용하시면 .DateTimeFormatterSimpleDateFormatter뿐만 아니라.

원답:

다음 설명은 형식이 나타내는 것과 마찬가지로 여전히 유효합니다.그러나 Java 8이 보급되기 전에 작성되었기 때문에 Java 8 이상을 사용하는 경우에는 사용하지 말아야 할 오래된 클래스를 사용합니다.

할 수 있습니다.Z다음과 같이 합니다.

패턴에서는, 「」는T 가지고 도망치다'양쪽에양쪽으로

그 의 패턴의 패턴Z결국 실제로 사실마지막은 있다.XXX그 JavaDoc에 JavaDoc에 기재되어 있는바와 같이를 기록.SimpleDateFormat, 그것은 그저 무척에 실제로 어떻게부터 그것을 사용하는 실제로 어떻게 사용하는지는 명확하지 않을 뿐입니다 분명하지 않다.Z옛 노인의 표식이다의 마커입니다.TimeZone정보도 함께.정보를얻을 수 있습니다.

Q2597083.java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Q2597083
{
    /**
     * All Dates are normalized to UTC, it is up the client code to convert to the appropriate TimeZone.
     */
    public static final TimeZone UTC;

    /**
     * @see <a href="http://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">Combined Date and Time Representations</a>
     */
    public static final String ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

    /**
     * 0001-01-01T00:00:00.000Z
     */
    public static final Date BEGINNING_OF_TIME;

    /**
     * 292278994-08-17T07:12:55.807Z
     */
    public static final Date END_OF_TIME;

    static
    {
        UTC = TimeZone.getTimeZone("UTC");
        TimeZone.setDefault(UTC);
        final Calendar c = new GregorianCalendar(UTC);
        c.set(1, 0, 1, 0, 0, 0);
        c.set(Calendar.MILLISECOND, 0);
        BEGINNING_OF_TIME = c.getTime();
        c.setTime(new Date(Long.MAX_VALUE));
        END_OF_TIME = c.getTime();
    }

    public static void main(String[] args) throws Exception
    {

        final SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_24H_FULL_FORMAT);
        sdf.setTimeZone(UTC);
        System.out.println("sdf.format(BEGINNING_OF_TIME) = " + sdf.format(BEGINNING_OF_TIME));
        System.out.println("sdf.format(END_OF_TIME) = " + sdf.format(END_OF_TIME));
        System.out.println("sdf.format(new Date()) = " + sdf.format(new Date()));
        System.out.println("sdf.parse(\"2015-04-28T14:23:38.521Z\") = " + sdf.parse("2015-04-28T14:23:38.521Z"));
        System.out.println("sdf.parse(\"0001-01-01T00:00:00.000Z\") = " + sdf.parse("0001-01-01T00:00:00.000Z"));
        System.out.println("sdf.parse(\"292278994-08-17T07:12:55.807Z\") = " + sdf.parse("292278994-08-17T07:12:55.807Z"));
    }
}

다음 출력을 생성합니다.

sdf.format(BEGINNING_OF_TIME) = 0001-01-01T00:00:00.000Z
sdf.format(END_OF_TIME) = 292278994-08-17T07:12:55.807Z
sdf.format(new Date()) = 2015-04-28T14:38:25.956Z
sdf.parse("2015-04-28T14:23:38.521Z") = Tue Apr 28 14:23:38 UTC 2015
sdf.parse("0001-01-01T00:00:00.000Z") = Sat Jan 01 00:00:00 UTC 1
sdf.parse("292278994-08-17T07:12:55.807Z") = Sun Aug 17 07:12:55 UTC 292278994

dr;dr

사용 사용하다java.time.Instant등급 표준 ISO8601형식으로 UTC에서 순간을 나타내는 텍스트 구문 분석하는 데. 표준 ISO8601형식의 텍스트를구문 분석할 클래스(CoordinatedUniversalTime단위)입니다.

Instant.parse( "2010-10-02T12:23:23Z" )

ISO 8601

이 형식은 날짜-시간 문자열 형식에 대한 ISO 8601 표준에 의해 정의됩니다.

둘 다:

…문자열 해석 및 생성에는 기본적으로 ISO 8601 형식을 사용합니다.

일반적으로 오래된 java.util은 사용하지 마십시오.Date/.Calendar & java.text.SimpleDateFormat 클래스는 번거롭고 혼란스러우며 결함이 있는 것으로 악명 높습니다.상호 운용에 필요한 경우 상호 운용으로 변환할 수 있습니다.

java.time

Java 8 이후에 내장된 새로운 java.time 프레임워크입니다.JSR 310에서 정의되고 ThreeTen-Extra 프로젝트에서 확장된 Joda-Time에서 영감을 받았습니다.

Instant instant = Instant.parse( "2010-10-02T12:23:23Z" );  // `Instant` is always in UTC.

이전 클래스로 변환합니다.

java.util.Date date = java.util.Date.from( instant );  // Pass an `Instant` to the `from` method.

시간대

필요한 경우 시간대를 할당할 수 있습니다.

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );  // Assign a time zone adjustment from UTC.

변환하다.

java.util.Date date = java.util.Date.from( zdt.toInstant() );  // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.

조다 타임

업데이트: Joda-Time 프로젝트가 유지 보수 모드로 전환되었습니다.팀은 java.time 클래스로의 이행을 권장합니다.

다음은 Joda-Time 2.8의 코드 예입니다.

org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC );  // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.

이전 클래스로 변환합니다.할당된 시간대는 변환 시 j.u로 손실됩니다.날짜를 표준 시간대로 할당할 수 없습니다.

java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.

시간대

필요한 경우 시간대를 할당할 수 있습니다.

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );

Java의 날짜 유형 표(현대 및 레거시 모두)입니다.


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.

java.time 클래스는 어디서 얻을 수 있습니까?

  • 자바 SE 8, 자바 SE 9 이후
    • 붙박이.
    • 번들 구현이 포함된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
  • 자바 SE 6 및 자바 SE 7
    • java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
  • 안드로이드
    • 최신 버전의 Android 번들 구현 java.time 클래스.
    • 이전의 Android(<26)에서는 쓰리텐ABP 프로젝트가 ThreeTen-Backport(상기)를 채택하고 있습니다.'쓰리텐ABP 사용방법'을 참조하십시오.

Java 또는 Android 버전에 사용할 java.time 라이브러리의 표.

쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 유용한 클래스가 있습니다.

다음 방법으로 문자열을 타임스탬프로 해석할 수 있습니다.

public static void main(String[] args) {

    String timeStr = "2021-11-11T10:25:35+00:00";
    System.out.println(convertStringToTimestamp(timeStr));

}

static Timestamp convertStringToTimestamp(String dateAsString) {
    OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateAsString);
    final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
    return Optional.ofNullable(offsetDateTime.toString())
            .map(value -> LocalDateTime.parse(value, dateTimeFormatter))
            .map(Timestamp::valueOf)
            .orElse(null);
}

지금까지의 답변은 2개이며, 둘 다 길기 때문에(또한 tl;dr이 너무 짧기 때문에), 새로운 java.time 라이브러리를 사용하기 시작한 경험(Java version 8+에 대한 다른 답변에서 설명한 바와 같이 적용 가능)의 개요를 작성합니다.ISO 8601은 표준 날짜 작성 방법을 설정합니다.YYYY-MM-DD그래서 date-time의 형식(ms동안이 될 수도 있고 0,3,6, 또한 9자리 숫자)과 포맷 문자열이 필요할 뿐만 아니라 아래 있다.

import java.time.Instant;
public static void main(String[] args) {
    String date="2010-10-02T12:23:23Z";
    try {
        Instant myDate = Instant.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

필요없었지만 질문에서 연도를 얻는 것이 코드이기 때문에 다음과 같습니다.
까다롭다, 더 , 더 까다롭다, 더 까다롭다, 더 교활하다Instant 하다, 하다, 하다, 하다를 할 수 있어요.Calendar질문의 방법 Java 및 java.time에서 현재 연도의 정수 값을 가져오고 형식이 고정 하위 문자열인 IMHO를 캘린더로 변환하는 것이 더 사용하기 쉽습니다.

myDate.toString().substring(0,4);

언급URL : https://stackoverflow.com/questions/2597083/illegal-pattern-character-t-when-parsing-a-date-string-to-java-util-date

반응형