Javaで日付の比較をしたいです。
ただしDBの値が「2017-05-26」の形式なので本日の日付と比較するには時分秒を切り捨てなければいけません。
以下リンクのように
日付だけを比較
DateUtils.truncateを使えばできそうですが、DateUtilsクラスをインポートできない環境でした。
他にいい方法があればよろしくお願いします。
現在の状況。これだと同じ日付でも時分秒が異なるとfalseになってしまうときがある。
java
1public boolean getFlg() throws ParseException { 2 3SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 4Date startDate = sdf.parse("2007-01-01"); 5Date endDate = sdf.parse("2017-05-26"); 6 7Date now = new Date(); 8int diff1 = now.compareTo(startDate); 9int diff2 = endDate.compareTo(now); 10 11if (diff1 >= 0 && diff2 >= 0) { 12 return true; 13} 14 return false; 15}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
切り捨てる必要はありません。
「2007/01/01から2017/05/26の間」であることを判定するには、
「2007/01/01 00:00:00(日本時間)以降、2017/05/27 00:00:00(日本時間)より前」であることを判定すればいいのです。
26日ではなく27日を使うのがポイント。だから期末日を1日進めて使うようにしてみてください。
投稿2017/05/25 23:16
総合スコア5570
0
いくつか方法を提示します。お好きなものをお使いください。
- すべてCalendarに変換する
(yubaさんの提案を織り交ぜています)
java
1public boolean getFlg() throws ParseException { 2 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 4 Date startDate = sdf.parse("2007-01-01"); 5 Date endDate = sdf.parse("2017-05-26"); 6 7 Calendar from = Calendar.getInstance(), 8 today = Calendar.getInstance(), 9 to = Calendar.getInstance(); 10 from.setTime(startDate); 11 to.setTime(endDate); 12 to.add(Calendar.DATE, 1); //終了日時を翌日に 13 14 int diff1 = today.compareTo(from); 15 int diff2 = to.compareTo(today); 16 17 return diff1 >= 0 && diff2 > 0; 18}
- getTime()で得られるlong値で比較。その際に終了日時のほうに1日相当のミリ秒を加算する
java
1public boolean getFlg() throws ParseException { 2 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 4 long startDate = sdf.parse("2007-01-01").getTime(); 5 long endDate = sdf.parse("2017-05-26").getTime() + 24L * 60L * 60L * 1000L; 6 long now = new Date().getTime(); 7 8 return startDate <= now && now < endDate; 9}
- 逆転の発想。文字列に変換して比較する
日付の後先と文字列化した日付の後先は一致する
java
1public boolean getFlg() { 2 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 4 String startDate = "2007-01-01"; 5 String endDate = "2017-05-26"; 6 String now = sdf.format(new Date()); 7 8 int diff1 = now.compareTo(startDate); 9 int diff2 = endDate.compareTo(now); 10 11 return diff1 >= 0 && diff2 >= 0; 12}
- LocalDateを使用(Java8以降限定)
java
1public boolean getFlg() { 2 3 LocalDate startDate = LocalDate.parse("2007-01-01"); 4 LocalDate endDate = LocalDate.parse("2017-05-26"); 5 LocalDate now = LocalDate.now(); 6 7 int diff1 = now.compareTo(startDate); 8 int diff2 = endDate.compareTo(now); 9 10 return diff1 >= 0 && diff2 >= 0; 11}
今更追加(17/09/17)。
- 日付比較するメソッドを作る
java
1public boolean getFlg() throws ParseException { 2 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 4 Date startDate = sdf.parse("2007-01-01"); 5 Date endDate = sdf.parse("2017-05-26"); 6 7 Calendar from = Calendar.getInstance(), 8 today = Calendar.getInstance(), 9 to = Calendar.getInstance(); 10 from.setTime(startDate); 11 to.setTime(endDate); 12 13 return compareByDate(from, today) <= 0 && compareByDate(today, to) <= 0; 14} 15 16public static int compareByDate(Calendar c1, Calendar c2) { 17 int i = Integer.compare(c1.get(Calendar.YEAR), c2.get(Calendar.YEAR)); 18 if (i != 0) return i; 19 return Integer.compare(c1.get(Calendar.DAY_OF_YEAR), c2.get(Calendar.DAY_OF_YEAR)); 20}
投稿2017/05/26 01:14
編集2017/09/16 15:45総合スコア20675
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/26 09:48
2017/05/26 11:05

0
全くお薦めしませんが、日付文字列の書式が決まっているなら数値で比較してはどうでしょう。
Java
1String d1 = "2017-01-01"; 2String d2 = "2017-05-26"; 3d1 = d1.replaceAll("-", ""); 4d2 = d2.replaceAll("-", ""); 5Integer d1i = Integer.parseInt(d1); 6Integer d2i = Integer.parseInt(d2); 7System.out.println(d1i.compareTo(d2i));
しかしながら他の方も記載されていますが、期間判定とかを行うならCalendarを使った方がいいと思いますよ。以下のコードは適当ですが、時分秒ミリ秒を固定で初期化してもいいわけですし。
Java
1SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 2Date startDate = formatter.parse("2007-01-01" + " 00:00:00.000"); 3Date endDate = formatter.parse("2017-05-26" + " 00:00:00.000");
投稿2017/05/26 02:39
総合スコア72
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/26 02:44

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/25 23:43
2017/05/26 01:41
2017/05/26 09:09