75 votes

Utiliser l'API Joda Date & Time pour analyser plusieurs formats

Je suis d'analyse tiers des fichiers journaux contenant de la date/heure à l'aide de Joda. La date/heure est dans un des deux formats différents, en fonction de l'âge des fichiers de log, je suis de l'analyse.

Actuellement, j'ai un code comme ceci:

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 à Joshua Bloch conseils Efficaces Java 2nd Edition (Article 57: Utilisez uniquement des exceptions pour des conditions exceptionnelles). Il rend également difficile de déterminer si une IllegalArgumentException se produit en raison d'un foutu date/heure dans un fichier journal.

Pouvez-vous suggérer une approche plus agréable que ne l'abus des exceptions?

143voto

btiernay Points 2213

Vous pouvez créer plusieurs analyseurs et les ajouter au générateur à l'aide de 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" );
 

17voto

JodaStephen Points 6357

Joda-Time le permet en permettant de spécifier plusieurs analyseurs syntaxiques - DateTimeFormatterBuilder # append

Créez simplement vos deux formateurs en utilisant un générateur et appelez toParser() sur chacun. Ensuite, utilisez le générateur pour les combiner avec append .

7voto

Jon Skeet Points 692016

Malheureusement, je ne crois pas Joda Time a tout de telles capacités. Il serait agréable d'avoir un "tryParseDateTime" la méthode, mais il n'existe pas.

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

Notez que DateTimeFormatters dans Joda Time sont classiquement immuable - vous ne devriez pas être en créer un nouveau à chaque fois que vous voulez analyser une ligne. Créer une fois et de les réutiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X