How to get the given date string format(pattern) in java?

后端 未结 10 1677
抹茶落季
抹茶落季 2020-11-30 04:41

I want to get the format of a given date string.

Example: I have a string like 2011-09-27T07:04:21.97-05:00 and the date format of this string is

10条回答
  •  一向
    一向 (楼主)
    2020-11-30 04:57

    java.time and its predefined formatters

    We cannot do this for just any date-time format. There are thousands of them, we cannot know them all (someone will invent a new one tomorrow), and some look alike so much we can’t tell which we’ve got.

    I suggest that for the majority of purposes you need to parse the string, but you don’t need to know a format pattern for doing so. In very many cases, including the example from your question, 2011-09-27T07:04:21.97-05:00, we don’t need to specify a pattern (your string matches DateTimeFormatter.ISO_OFFSET_DATE_TIME).

    Since Java 8 came out in 2014 (and even if still using Java 6 or 7), use java.time, the modern Java date and time API, for your date and time work.

    I am defining an array of formatters for the formats we want to cater for. Please substitute your own set.

    private static final DateTimeFormatter[] formatters = {
            DateTimeFormatter.ISO_OFFSET_DATE_TIME,
            DateTimeFormatter.RFC_1123_DATE_TIME,
            new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                    .parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
                    .toFormatter(),
            DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withLocale(Locale.US),
            DateTimeFormatter.ofPattern("MM/dd/uuuu HH:mm")
                    .withZone(ZoneId.of("America/Los_Angeles"))
    };
    

    The following method tries the formatters in turn until one works:

    private static OffsetDateTime parse(String dateTimeString) {
        for (DateTimeFormatter formatter : formatters) {
            try {
                return ZonedDateTime.parse(dateTimeString, formatter)
                        .toOffsetDateTime();
            } catch (DateTimeParseException dtpe) {
                // Ignore, try next formatter
            }
        }
        throw new IllegalArgumentException("String " + dateTimeString + " could not be parsed");
    } 
    

    Let’s try it out with some different strings:

        String[] dateTimeStrings = {
                "2011-09-27T07:04:21.97-05:00",
                "20110917",
                "2012-07-04",
                "12/27/2014 23:45",
                "Mon, 12 Nov 2018 01:32:10 GMT",
                "July 29, 2015 at 10:19:36 AM EDT",
        };
        
        for (String dts : dateTimeStrings) {
            try {
                System.out.format("%32s -> %s%n", dts, parse(dts));
            } catch (IllegalArgumentException iae) {
                System.out.format("%32s -> %s%n", dts, iae);
            }
        }
    

    Output is:

        2011-09-27T07:04:21.97-05:00 -> 2011-09-27T07:04:21.970-05:00
                            20110917 -> java.lang.IllegalArgumentException: String 20110917 could not be parsed
                          2012-07-04 -> 2012-07-04T00:00Z
                    12/27/2014 23:45 -> 2014-12-27T23:45-08:00
       Mon, 12 Nov 2018 01:32:10 GMT -> 2018-11-12T01:32:10Z
    July 29, 2015 at 10:19:36 AM EDT -> 2015-07-29T10:19:36-04:00
    

    Other options

    Techniques for parsing dates and times in multiple formats include:

    • Take a taste of the string to decide its format and use an appropriate formatter based on that. It’s best suited if you have just a few formats, though the answer by Vinit Solanki shows an elaborate version for quite many formats.
    • Use optional parts in a format pattern string. For example [uuuu][uu] will parse either four digit or two digit year (2021 or just 21).
    • Try several formatters in turn as shown in my code above. If you do need to know the pattern, use an array of patterns instead of an array of formatters.
    • Requiring the supplier of the string to supply a format patterns string too. This is not always as simple as it may sound, though.

    Beware of ambiguity. The classical example is the two formats MM-dd-yyyy and dd-MM-yyyy. If we get a string of 03-09-2020, there’s no way to tell whether it means March 9 or 3rd September. Even worse, 02-05-07 might be yy-MM-dd, dd-MM-yy, MM-dd-yy and even more possibilities. As a consequence, make sure you don’t include two (or more) formatters that may parse the same string into different results.

    Links

    • Oracle tutorial: Date Time explaining how to use java.time.
    • A fine answer by Arvind Kumar Avinash showing the use of optional parts in the format pattern string for parsing different formats.

提交回复
热议问题