Parse toute date en Java

Je sais que cette question est posée un peu, et vous ne pouvez évidemment pas parsingr une date arbitraire. Cependant, je trouve que la bibliothèque python-dateutil est capable d’parsingr chaque date que je lui envoie, tout en exigeant un effort absolument nul pour déterminer une chaîne de format de date. Joda Time est toujours vendu comme un excellent parsingur de date Java, mais vous devez décider du format de votre date avant de choisir un format (ou de le créer). Vous ne pouvez pas simplement appeler DateFormatter.parse (mydate) et récupérer comme par magie un object Date.

Par exemple, la date “Wed Mar 04 05:09:06 GMT-06: 00 2009” est correctement analysée avec python-dateutil:

import dateutil.parser print dateutil.parser.parse('Wed Mar 04 05:09:06 GMT-06:00 2009') 

mais l’appel de temps Joda suivant ne fonctionne pas:

  Ssortingng date = "Wed Mar 04 05:09:06 GMT-06:00 2009"; DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); DateTime dt = fmt.parseDateTime(date); System.out.println(date); 

Et créer votre propre DateTimeFormatter va à l’encontre du but, car cela semble être la même chose que d’utiliser SimpleDateFormatter avec la chaîne de format correcte.

Existe-t-il une méthode comparable pour parsingr une date en Java, comme python-dateutil? Je ne me soucie pas des erreurs, je veux juste que ce soit surtout parfait.

Votre meilleur pari est vraiment de demander de l’aide pour regex pour correspondre au modèle de format de date et / ou pour faire un forçage brutal.

Il y a plusieurs années, j’ai écrit un petit cours idiot DateUtil qui a fait le travail. Voici un extrait de pertinence:

 private static final Map DATE_FORMAT_REGEXPS = new HashMap() {{ 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[az]{3}\\s\\d{4}$", "dd MMM yyyy"); put("^\\d{1,2}\\s[az]{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[az]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm"); put("^\\d{1,2}\\s[az]{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[az]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss"); put("^\\d{1,2}\\s[az]{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 ssortingng. Returns null if * format is unknown. You can simply extend DateUtil with more formats if needed. * @param dateSsortingng The date ssortingng to determine the SimpleDateFormat pattern for. * @return The matching SimpleDateFormat pattern, or null if format is unknown. * @see SimpleDateFormat */ public static Ssortingng determineDateFormat(Ssortingng dateSsortingng) { for (Ssortingng regexp : DATE_FORMAT_REGEXPS.keySet()) { if (dateSsortingng.toLowerCase().matches(regexp)) { return DATE_FORMAT_REGEXPS.get(regexp); } } return null; // Unknown format. } 

(toux, initialisation à double attelle, toux, c’était juste pour que tout corresponde à la longueur maximale de 100 carats;))

Vous pouvez facilement le développer vous-même avec de nouveaux motifs regex et dateformat.

Il y a une belle bibliothèque appelée Natty qui, selon moi, répond à vos besoins:

Natty est un parsingur de date en langage naturel écrit en Java. Étant donné une expression de date, natty appliquera des techniques standard de reconnaissance et de traduction du langage pour produire une liste de dates correspondantes avec des informations d’parsing et de syntaxe facultatives.

Vous pouvez aussi l’ essayer en ligne !

Ce que j’ai vu faire est une classe Date util qui contient plusieurs formats de date typiques. Ainsi, lorsque DateUtil.parse (date) est appelé, il essaie d’parsingr la date avec chaque format de date en interne et ne lève que des exceptions si aucun des formats internes ne peut l’parsingr.

C’est fondamentalement une approche brutale de votre problème.