2017-07-21 12 views
2
私は2つの日付の差を見つけようとしています

のために働いて働いていないと、私は次のことをやった:Javaの日付の解析は、月

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class test { 

public static void main(String[] args) { 
    Date date = new Date(); 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD"); 
    String accessioned = "2017-04-27"; 
    System.out.println(date); 

    try { 
     date = format.parse(accessioned); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    System.out.println(date); 

    Date now = new Date(); 

    long diff = now.getTime() - date.getTime(); 
    System.out.println(diff); 

    if ((diff/(1000 * 60 * 60 * 24)) >= 30) { 
     System.out.println("haha"); 
    } 

} 

} 

これは、出力Iが得る:問題

Fri Jul 21 14:23:59 CEST 2017 
Fri Jan 27 00:00:00 CET 2017 
15168239705 
haha 

例えば、 "2017-04-28"にアクセスした文字列を変更した場合は、それに応じて日付が変わりますが、同じことは年になりますが、私が月に入れた値は何でも、常に1月を出力します。たとえば私のコードでは4月になるはずだが、出力には1月が表示される

何が間違っているの?

+2

[ 'SimpleDateFormat'のjavadoc](https://docs.oracle.com/javase/をチェック7/docs/api/java/text/SimpleDateFormat.html):大文字の「D」は**日の年**ですが、必要なのは**月の日です**、小文字の「d」で表されます –

+2

あなたは尋ねる前にどれくらい検索しましたか?正当な答えがいくつか出てきているようですが、もちろん、あなたの検索エンジンであなたの答えがさらに速くなっているかもしれないと思っています。これに似た質問と回答がたくさんあります。 –

+0

他にも役立ちます:[05/05/1999と5/5/1999などを受け入れる日付時刻の解析](https://stackoverflow.com/questions/227608/date-time-parsing-that-accepts-05-05 -1999-and-5-5-1999-etc)。 –

答えて

5

変更DSimpleDateFormat Docdへ:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
  • Dは年に一日のためである(1〜365)
  • dは月の日(1-31)
です

また、Java8のLocalDateを使用するとさらに便利になりますDateTimeFormatter Doc/LocalDate Doc


あなたは明らかに日の差は、現在またはないあなたの日付との間>=30であるかどうかを確認したいので、私は別のLocalDateと解決策を提案します:

LocalDate localDate = LocalDate.parse("2017-04-27", DateTimeFormatter.ofPattern("yyyy-MM-dd")); 
long daysDiff = localDate.until(LocalDate.now(), ChronoUnit.DAYS); 

System.out.println(daysDiff); 
if (daysDiff >= 30){ 
    System.out.println("haha"); 
} 

EDITを:あなたがする必要があります問題はヨーヨーです

にも
LocalDateTime localDateTime = LocalDateTime.parse("2017-04-21T11:51:36Z", DateTimeFormatter.ISO_DATE_TIME); 
+0

@ azro答えと説明をありがとう。 LocalDateを使用するための提案については、それは良いようですが、解析する必要がある文字列は "2017-04-21T11:51:36Z"の形式になりますが、これに対してDateTimeFormatter.ofPatternは何が必要ですか? – Uttam

+0

もう一度文書を見ましたか?わからない、私は答えを編集して、あなたが大丈夫になるときに答えを受け入れることについて考えている;) – azro

3

を時/分/秒を使用できるようにLocalDateTimeの代わりLocalDateを使用ウルの日付形式:new SimpleDateFormat("yyyy-MM-DD")
は、すでにの2桁の形式です。Dは、dである「曜日」ではなく、「曜日」を表します。私を与える...

SimpleDateFormat("y-M-d") 

: あなたの形式は、次のようになります

Fri Jul 21 14:44:03 CEST 2017 
Thu Apr 27 00:00:00 CEST 2017 
7397043764 
haha