2017-09-29 7 views
3
import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 
import java.util.Locale; 


public class Solution { 
public static void main(String[] args) { 
    System.out.println(isDateOdd("MAY 1 2013")); 
} 

public static boolean isDateOdd(String date) { 

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy"); 
    formatter = formatter.withLocale(Locale.ENGLISH); 
    LocalDate outputDate = LocalDate.parse(date, formatter); 
    return ((outputDate.getDayOfYear()%2!=0)?true:false); 
} 
} 

Je veux savoir si le nombre de jours écoulés entre le début de l'année et une date donnée est impair. J'essaie d'utiliser LocalDate pour analyser la date de ma chaîne (1er mai 2013), mais j'obtiens l'erreur:Erreur d'exception LocalDate

Exception in thread "main" java.time.format.DateTimeParseException: Text 'MAY 1 2013' could not be parsed at index 0 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) at java.time.LocalDate.parse(LocalDate.java:400) at com.javarush.task.task08.task0827.Solution.isDateOdd(Solution.java:23) at com.javarush.task.task08.task0827.Solution.main(Solution.java:16)

Où est un problème?

+0

Que diriez-vous 'MAI 01 2013'? – nullpointer

+0

Essayé cela juste maintenant, mais cela ne fonctionne toujours pas. – Aldres

+0

MAI devrait être Mai aussi @nullpointer – notyou

Répondre

5

Si vous souhaitez utiliser toutes les lettres majuscules, ex l'entrée du mois. MAY, vous devez utiliser DateTimeFormatter insensible à la casse:

public static boolean isDateOdd(String date) { 
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
      .parseCaseInsensitive() 
      .appendPattern("MMM d yyyy") 
      .toFormatter(Locale.ENGLISH); 
    LocalDate outputDate = LocalDate.parse(date, formatter); 
    return (outputDate.getDayOfYear() % 2 != 0); 
} 

Comme le documentation de la méthode parseCaseSensitive() dit:

Since the default is case sensitive, this method should only be used after a previous call to #parseCaseInsensitive.

+0

Oui! Le problème était dans parseCaseInsensitive. Je vous remercie. Donc, sans .parseCaseIntensitive, cela ne fonctionnera qu'avec "May 01 1998", n'est-ce pas? – Aldres

+2

L'insensibilité à la casse signifie que le traitement n'est pas influencé par le boîtier du léter. Donc, toutes les variations de cas du mois vont fonctionner: 'mAy', 'MAI',' may', 'MAI 'etc ... –

+0

@Aldres, vous avez raison, avec l'analyse de la casse par défaut seulement Mai (capital M, petit ay) seront reconnus. –

2

Modifier MAY à May et 1 à 01 et cela fonctionnera.

2

Votre partie de jour doit avoir deux chiffres, c'est-à-dire "MAY 01 2013".

Ensuite, si vous voulez vraiment passer des noms de mois majuscules, vous devez utiliser un générateur avec parseCaseInsensitive().

Mettre le tout ensemble:

public static boolean isDateOdd(String date) { 

    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); 
    builder.parseCaseInsensitive(); 
    builder.appendPattern("MMM dd yyyy"); 
    DateTimeFormatter formatter = builder.toFormatter(Locale.ENGLISH); 

    LocalDate outputDate = LocalDate.parse(date, formatter); 
    return ((outputDate.getDayOfYear()%2!=0)?true:false); 
} 
}