2017-09-29 54 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); 
} 
} 

年の初めからある日に渡された日数が奇数の場合は、知りたいことがあります。私は私の文字列(2013年5月1日)から日付を解析するためにLOCALDATEを使用しようと、私はエラーを取得: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)

どこに問題がありますか?

+0

どのように5月1日2013' 'は? – nullpointer

+0

これを今試しましたが、それでも動作しません。 – Aldres

+0

5月になるかもしれない@nullpointer – notyou

答えて

5

を使用すると、すべて大文字で月の入力、EXを使用する場合:すべて一緒にそれを置く

MAY、あなたは大文字と小文字を区別しないてDateTimeFormatter使用する必要があります:parseCaseSensitive()方法のdocumentationとして

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); 
} 

を言う:

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

+0

はい!問題はparseCaseInsensitiveにありました。ありがとうございました。したがって、.parseCaseIntensitiveを指定しないと、 "May 01 1998"としか動作しません。 – Aldres

+2

大文字小文字の区別がないということは、処理がレターケーシングの影響を受けていないことを意味します。 'MAY'、' MAY'、 'may'、' mAY'など... –

+0

@Aldres、大文字と小文字を区別するデフォルトの構文解析のみでMay(資本金M、小額)が認識される。 –

2

改訂MAYからMay1から01となります。

2

1日の部分は2桁でなければなりません。つまり、"MAY 01 2013"です。

大文字の月の名前を実際に渡したい場合は、parseCaseInsensitive()と一緒にビルダーを使用する必要があります。

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); 
} 
}