Generic way to parse dates in Java

后端 未结 7 850
醉酒成梦
醉酒成梦 2021-01-19 00:03

What is the best way to parse dates in Java ? Is there any built in way to parse strings such as \"18 Jul 2011\" , \"Jul 18, 2011\", \"18-07-2011\", \"2011-07-18\" without k

相关标签:
7条回答
  • 2021-01-19 00:37

    If you are familiar with the Simpledateformat you can just add a couple of dateformatter in a list/array and do them all after another until one hits a valid date.

    The problem here is: What do you do with a date such as

    06-07-2011

    Is it July 6th or is it June 7th?

    But to answer to question: no there is not a "built in generic way"

    0 讨论(0)
  • 2021-01-19 00:38

    This is a large issue, mostly because dates are a fuzzy concept - for example is 02-01-2012 in February or January?

    The best you can do is collect a bunch of different format strings and try each one until you get a match...

    0 讨论(0)
  • 2021-01-19 00:40

    try DateFormat with the default Format DateFormat.MEDIUM and SHORT.

    public static void main(String[] args) {
        // Make a String that has a date in it, with MEDIUM date format
        // and SHORT time format.
        String dateString = "Nov 4, 2003 8:14 PM";
    
        // Get the default MEDIUM/SHORT DateFormat
        DateFormat format =
            DateFormat.getDateTimeInstance(
            DateFormat.MEDIUM, DateFormat.SHORT);
    
        // Parse the date
        try {
            Date date = format.parse(dateString);
            System.out.println("Original string: " + dateString);
            System.out.println("Parsed date    : " +
                 date.toString());
        }
        catch(ParseException pe) {
            System.out.println("ERROR: could not parse date in string \"" +
                dateString + "\"");
        }
    

    Snipped from http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/

    On exception you have to decide what todo next, you can build a hierarchy of Parsing Trys. like:

    SimpleDateFormat df1 = new SimpleDateFormat( "dd/MM/yyyy" );
    SimpleDateFormat df2 = new SimpleDateFormat( "dd-MM-yyyy" );
    
    df1.parse(..)
    df2.parse(..)
    

    and so on.

    0 讨论(0)
  • 2021-01-19 00:41

    You can use DateFormat.parse(...) and use a locale for the dateformat, but that still might not handle all those cases. It's also not that easy: consider the following two possible dates (which are the same): 18/07/2011 and 07/18/2011 - how should that be parsed without knowing whether it is dd/mm/yyyy or mm/dd/yyyy (e.g. in Saudi Arabia)?

    0 讨论(0)
  • 2021-01-19 00:47

    There's nothing like that in the standard API library. Natty is a library that attempts this, but you should be aware that this can only ever be a "best effort" affair, as things like 2/1/2012 are simply ambiguous: without metainformation about the format, it's impossible to decide whether it's Feburary 1st or January 2nd.

    0 讨论(0)
  • 2021-01-19 00:52

    Not really. BalusC wrote a brilliant post on DateUtil, that "solves" most date formats parsing.

    0 讨论(0)
提交回复
热议问题