質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

14717閲覧

[Java]日付の比較をしたい

k499778

総合スコア599

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/05/25 22:15

編集2017/05/25 22:16

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2017/05/25 23:43

startDateも同様にマイナス1するのでしょうか? startDate,endDateはDBの値なのでできればいじりたくないのですが、nowをいじるとどうなりますでしょうか?
swordone

2017/05/26 01:41

endDateに1日足す目的は、2017-05-26 **:**:**に対応するためです。 これは*部が何時何分何秒であろうと2017-05-27 00:00:00の前になり、 日付を過ぎた2017-05-27 **:**:**の時刻は2017-05-27 00:00:00以降になります。つまり、 2017-05-26 **:**:** < 2017-05-27 00:00:00 <= 2017-05-27 **:**:** となるので、この条件で2017-05-26までの日付を判定できるのです。 逆にstartDateはいじる必要はありません。
k499778

2017/05/26 09:09

回答ありがとうございます。 そうでしたか。いろんな観点を学ぶことができました。ありがとうございました。
guest

0

いくつか方法を提示します。お好きなものをお使いください。

(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}

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
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2017/05/26 09:10

回答ありがとうございます。 こんなにもたくさん!ご提示頂きありがとうございます。 1度自分で噛み砕いて自分のものにしたいと思います。感謝いたします。ありがとうございました。
yuba

2017/05/26 09:48

このコードでつっこみどころがあると、「一日後」の表現の仕方ですね。 24時間分のミリ秒を加算するやり方は、夏時間制度が導入されたときにおかしくなります(あり得ない? いやいや、今の立法なら明日どんな法律ができてるかわかりません)。翌日を意味するためには23時間もしくは25時間進めないといけない日というのが出てきますから。 スマートさは薄れるのですがCalendarで年・月・日に分解して日を1増やしたCalendarを作り直してそこからタイムスタンプを取ってDateに、というのが頑強なやり方になります。
swordone

2017/05/26 10:47

そうなると1つ目とほぼかぶるので2つ目はボツですね
yuba

2017/05/26 11:05

あっ一つ目をちゃんと開いたらちゃんとそうなっていました。なんか開かないまま読んでいて2つめと混同していました。
guest

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

sllmejacob

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/05/26 02:44

現在時刻の処理が入っていないので全く意味のないコードになっています。
sllmejacob

2017/05/26 02:55

私は『yyyy-MM-ddの部分だけで同一日かどうか判断したい』という意図だと理解したので上記のように回答したのですが…まあ受け取り方次第ということで。
k499778

2017/05/26 09:10

回答ありがとうございます。 私の方でも1度確認してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問