2010-11-11 4 views
2

supposons que je les dates suivantes (en String):Comment forcer Joda-Time à n'analyser qu'une partie de String?

2009-05-15T23:00:00 
2009-05-15T23:00:00.000Z 
2009-05-15 

Je ne me soucie pas de l'heure et de la zone, seule la date est pertinente pour moi. Donc, je veux essayer de l'analyser avec motif suivant:

aaaa-mm-jj

je tente de l'analyser en utilisant Joda-Time:

DateTimeFormat = DateTimeFormat.forPattern("yyyy-MM-dd"); 
format.withZone(zone).parseDateTime(string).toLocalDate(); 

et je reçois une exception près:

java.lang.IllegalArgumentException: Invalid format: "2009-05-15T23:00:00.000Z" is malformed at "T23:00:00.000Z" 

Existe-t-il un moyen de forcer Joda-Time à ignorer le reste de la chaîne?

Répondre

1

J'ai eu le même problème, plusieurs formats de date où je voulais juste tout ignorer après un certain point. Ce que j'ai fait était de créer un consommer tous DateTimeParser, puis l'ajouter en utilisant un DateTimeFormatterBuilder.

Je crois que ce serait répondre à vos besoins:

JodaDateTimeConsumeAll.java:

public class JodaDateTimeConsumeAll implements DateTimeParser{ 

    @Override 
    public int estimateParsedLength() { 
     return 100; 
    } 

    @Override 
    public int parseInto(DateTimeParserBucket bucket, String text, int position) { 
     return text.length(); //consume the whole thing 
    } 

} 

FormatterBuilder:

DateTimeParser dtp = new DateTimeFormatterBuilder() 
    .appendYear(4,4) 
    .appendLiteral("-") 
    .appendDayOfMonth(2) 
    .appendLiteral("-") 
    .appendMonthOfYear(2) 
    .append(new JodaDateTimeConsumeAll()) 
    .toFormatter() 
    .getParser(); 

J'espère que cela aide.

3

Utilisez simplement la sous-chaîne appropriée; 2009-05-15 et l'analyser avec le motif yyyy-MM-dd.

+0

Merci - le fait est, que j'ai beaucoup de formats qui pourraient différer dans la dernière partie ... – krtek

+0

@krtek: bien, une sous-chaîne (0, 10) correspondrait à 2009-05-15 dans tous les cas vous mentionné ;-) – darioo

0

Vous pouvez toujours ignorer le fuseau horaire après que la date a été analysée avec succès.

Pour utiliser maintenant le motif (pour le format de votre chaîne de date 2009-05-15T23:00:00.000Z)

yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 

Est-ce votre format de date même tout au long de votre application ou sont-ils différents?


Sur la base de votre message, il vous semble ne pas vraiment besoin modifié la partie du temps, donc il suffit d'obtenir les 10 premiers caractères pertinents de la chaîne de date et l'analyser avec le format yyyy-MM-dd.

+0

Le format de la date peut être très différent car ils proviennent de différentes sources - veuillez voir la question reformatée. – krtek

+0

Je vous vois édité votre message ... va mettre à jour. –

1

Je pense que vous devrez d'abord faire correspondre le modèle de chaîne, puis passer cette sous-chaîne correspondante à jodatime.