Parse any date in Java

后端 未结 6 692
时光取名叫无心
时光取名叫无心 2020-11-22 07:31

I know this question is asked quite a bit, and obviously you can\'t parse any arbitrary date. However, I find that the python-dateutil library is able to parse every date I

相关标签:
6条回答
  • 2020-11-22 08:03

    What I have seen done is a Date util class that contains several typical date formats. So, when DateUtil.parse(date) is called, it tries to parse the date with each date format internally and only throws exceptions if none of the internal formats can parse it.

    It is basically a brute force approach to your problem.

    0 讨论(0)
  • 2020-11-22 08:04
    //download library:   org.ocpsoft.prettytime.nlp.PrettyTimeParser
    String str = "2020.03.03";
    Date date = new PrettyTimeParser().parseSyntax(str).get(0).getDates().get(0);
    System.out.println(date)
    
    0 讨论(0)
  • 2020-11-22 08:10

    There is a nice library called Natty which I think fits your purposes:

    Natty is a natural language date parser written in Java. Given a date expression, natty will apply standard language recognition and translation techniques to produce a list of corresponding dates with optional parse and syntax information.

    You can also try it online!

    0 讨论(0)
  • 2020-11-22 08:17

    Your best bet is really asking help to regex to match the date format pattern and/or to do brute forcing.

    Several years ago I wrote a little silly DateUtil class which did the job. Here's an extract of relevance:

    private static final Map<String, String> DATE_FORMAT_REGEXPS = new HashMap<String, String>() {{
        put("^\\d{8}$", "yyyyMMdd");
        put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy");
        put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd");
        put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "MM/dd/yyyy");
        put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd");
        put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}$", "dd MMM yyyy");
        put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}$", "dd MMMM yyyy");
        put("^\\d{12}$", "yyyyMMddHHmm");
        put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm");
        put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm");
        put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm");
        put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "MM/dd/yyyy HH:mm");
        put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm");
        put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm");
        put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMMM yyyy HH:mm");
        put("^\\d{14}$", "yyyyMMddHHmmss");
        put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss");
        put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss");
        put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss");
        put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "MM/dd/yyyy HH:mm:ss");
        put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss");
        put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss");
        put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss");
    }};
    
    /**
     * Determine SimpleDateFormat pattern matching with the given date string. Returns null if
     * format is unknown. You can simply extend DateUtil with more formats if needed.
     * @param dateString The date string to determine the SimpleDateFormat pattern for.
     * @return The matching SimpleDateFormat pattern, or null if format is unknown.
     * @see SimpleDateFormat
     */
    public static String determineDateFormat(String dateString) {
        for (String regexp : DATE_FORMAT_REGEXPS.keySet()) {
            if (dateString.toLowerCase().matches(regexp)) {
                return DATE_FORMAT_REGEXPS.get(regexp);
            }
        }
        return null; // Unknown format.
    }
    

    (cough, double brace initialization, cough, it was just to get it all to fit in 100 char max length ;) )

    You can easily expand it yourself with new regex and dateformat patterns.

    0 讨论(0)
  • 2020-11-22 08:22

    I have no idea about this parsing how to do in python. In java we can do like this

    SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yyyy");
      java.util.Date normalDate = null;
      java.sql.Date sqlDate = null;
      normalDate = sdf1.parse(date);
      sqlDate = new java.sql.Date(normalDate.getTime());
      System.out.println(sqlDate);
    

    i think like java some predefined functions will be there in python. You can follow this method. This methods parse the String date to Sql Date (dd-MM-yyyy);

    import java.text.SimpleDateFormat;
    import java.text.ParseException;
    public class HelloWorld{
         public static void main(String []args){
            String date ="26-12-2019";
             SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yyyy");
            java.util.Date normalDate = null;
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {
                try {
                    normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                    System.out.println(sqlDate);
                } catch (ParseException e) {
                }
            }
         }
    } 
    

    execute this!

    0 讨论(0)
  • 2020-11-22 08:24

    You could try dateparser.

    It can recognize any String automatically, and parse it into Date, Calendar, LocalDateTime, OffsetDateTime correctly and quickly(1us~1.5us).

    It doesn't based on any natural language analyzer or SimpleDateFormat or regex.Pattern.

    With it, you don't have to prepare any appropriate patterns like yyyy-MM-dd'T'HH:mm:ss.SSSZ or yyyy-MM-dd'T'HH:mm:ss.SSSZZ:

    Date date = DateParserUtils.parseDate("2015-04-29T10:15:00.500+0000");
    Calendar calendar = DateParserUtils.parseCalendar("2015-04-29T10:15:00.500Z");
    LocalDateTime dateTime = DateParserUtils.parseDateTime("2015-04-29 10:15:00.500 +00:00");
    

    All works fine, please enjoy it.

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