web-dev-qa-db-fra.com

Utilisation de l'API Joda Date & Time pour analyser plusieurs formats

J'analyse des fichiers journaux tiers contenant la date et l'heure à l'aide de Joda. La date/heure est dans l'un des deux formats différents, en fonction de l'âge des fichiers journaux que j'analyse.

Actuellement, j'ai un code comme celui-ci:

try {
    return DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss").parseDateTime(datePart);
} catch (IllegalArgumentException e) {
    return DateTimeFormat.forPattern("E, MMM dd, yyyy HH:mm").parseDateTime(datePart);
}

Cela fonctionne mais contrevient aux conseils de Joshua Bloch de Effective Java 2nd Edition (Item 57: Utiliser les exceptions uniquement pour des conditions exceptionnelles). Il est également difficile de déterminer si une exception IllegalArgumentException se produit en raison d'une date bousillée./heure dans un fichier journal.

Pouvez-vous suggérer une approche plus agréable qui n'utilise pas les exceptions à mauvais escient?

73
Steve McLeod

Vous pouvez créer plusieurs analyseurs et les ajouter au générateur en utilisant la méthode DateTimeFormatterBuilder.append :

DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(),
        DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parsers ).toFormatter();

DateTime date1 = formatter.parseDateTime( "2010-01-01" );
DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );
140
btiernay

Joda-Time prend en charge cela en permettant de spécifier plusieurs analyseurs - DateTimeFormatterBuilder # append

Créez simplement vos deux formateurs à l'aide d'un générateur et appelez toParser() sur chacun. Utilisez ensuite le générateur pour les combiner à l'aide de append.

17
JodaStephen

Malheureusement, je ne pense pas que Joda Time possède de telles capacités. Ce serait bien d'avoir une méthode "tryParseDateTime", mais elle n'existe pas.

Je vous suggère d'isoler ce comportement dans votre propre classe (celle qui prend une liste de modèles, et essaiera chacun à son tour) afin que la laideur ne soit qu'à un seul endroit. Si cela cause des problèmes de performances, vous pouvez essayer d'utiliser des heuristiques pour deviner quel format essayer en premier. Par exemple, dans votre cas, si la chaîne commence par un chiffre, c'est probablement le premier motif.

Notez que DateTimeFormatters dans Joda Time sont conventionnellement immuables - vous ne devriez pas en créer un nouveau chaque fois que vous voulez analyser une ligne. Créez-les une fois et réutilisez-les.

7
Jon Skeet