Illegal pattern character 'T' when parsing a date string to java.util.Date

后端 未结 3 466
野性不改
野性不改 2020-11-22 10:03

I have a date string and I want to parse it to normal date use the java Date API,the following is my code:

public static void main(String[] args) {
    Strin         


        
3条回答
  •  孤城傲影
    2020-11-22 10:28

    Update for Java 8 and higher

    You can now simply do Instant.parse("2015-04-28T14:23:38.521Z") and get the correct thing now, especially since you should be using Instant instead of the broken java.util.Date with the most recent versions of Java.

    You should be using DateTimeFormatter instead of SimpleDateFormatter as well.

    Original Answer:

    The explanation below is still valid as as what the format represents. But it was written before Java 8 was ubiquitous so it uses the old classes that you should not be using if you are using Java 8 or higher.

    This works with the input with the trailing Z as demonstrated:

    In the pattern the T is escaped with ' on either side.

    The pattern for the Z at the end is actually XXX as documented in the JavaDoc for SimpleDateFormat, it is just not very clear on actually how to use it since Z is the marker for the old TimeZone information as well.

    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 Combined Date and Time Representations
         */
        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"));
        }
    }
    

    Produces the following output:

    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
    

提交回复
热议问题