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

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

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

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

Q&A

解決済

2回答

2487閲覧

日にちの比較などif文の書き方を学びたい

k499778

総合スコア599

Java

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

0グッド

0クリップ

投稿2017/05/25 14:48

編集2017/05/25 21:11

Javaで次のようなif文の書き方を教えてほしいです。

以下はthymeleafでの書き方です。

html

1th:if="${obj.flg} eq 1 and ${#dates.format(obj.startDate)} le ${#dates.format(#dates.createToday())} and (${obj.endDate} eq null or ${#dates.format(#dates.creatToday())} le ${#dates.format(obj.endDate)})"

この条件に「obj != null」という条件を追加したいです。
しかしthymeleafで上の書き方にこの条件を追加する書き方がわからないのと、そもそも上のif文はとても長くなっているのでJava側で制御して、その戻り値をthymeleafに渡して制御しようと思っています。

この条件をJava側で書こうと思ったらどうなるでしょうか?とくに日にちの比較のところでつまづいています。
「obj.endDate」または「obj.startDate」にはDate型で「2016-05-01」という形式で値が入っています。

イメージとしては以下のような感じです。

Java

1SampleEntity obj = new SampleEntity(); 2 3 public boolean getFlg(){ 4 if(obj == null){ 5 return false; 6 } 7 if(obj.flg == 1 && obj.startDate <= 今日の日にち && (obj.endDate == null || 今日の日にち <= obj.endDate ) ){ 8 return true; 9 } 10 return false; 11 }

このJavaの書き方のアドバイスをいただきたいと思います。もし分かる方がいればよろしくお願い致します。


追記
現在以下のような形で書いています。
問題点としましては現在の時間nowが「時間:分:秒」まで設定されてしまい、同じ日付でもイコールにならないときがあるというところです。

java

1import java.text.ParseException; 2import java.text.SimpleDateFormat; 3import java.util.Date; 4 5public class Sample { 6 7 public static void main(String[] args) throws ParseException { 8 Sample s = new Sample(); 9 System.out.println(s.getFlg()); 10 11 } 12 13 SampleEntity obj = new SampleEntity(); 14 15 public boolean getFlg() throws ParseException { 16 17 // SampleEntity obj = new SampleEntity(); 18 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 19 // obj.startDate = format.parse("2007-01-01"); 20 // obj.endDate = format.parse("2017-05-26"); 21 // obj.flg = 1; 22 23 Date now = new Date(); 24 now = format.parse(now.toString()); 25 int diff1 = now.compareTo(obj.startDate); 26 int diff2 = obj.endDate.compareTo(now); 27 28 if (obj == null) { 29 return false; 30 } 31 if (obj.flg == 1 && diff1 >= 0 && (obj.endDate == null || diff2 >= 0)) { 32 return true; 33 } 34 return false; 35 } 36} 37 38

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

ベストアンサー

Dateクラスがこれなら、getTimeメソッドから得られるlong値を比較するという手段もありますが…

比較できるクラスには、Comparableというインタフェースが実装されています。
これはcompareToという、自身と同じ型を引数に取って、自身と引数のどちらが小さい(日付の場合はより早い)かを判定するメソッドを持ちます。
Dateクラスもこれを実装しているため、compareToメソッドで条件分岐ができます。

投稿2017/05/25 15:02

swordone

総合スコア20651

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

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

k499778

2017/05/25 21:13

上記にcompareToでの書き方を追記しました。 今日の日付との比較でまだ問題点が残っています。 お力添え頂けると助かります。
guest

0

Thymeleafでの比較演算子の書き方が、やや難しく書いているように思いました。

実はJavaのコードと同様、等号や不等号を使って比較演算子は記述でき、{ } は変数や関数ごとに閉じなくても正しく動作します。参考までに。

html

1th:if="${obj.flg == 1 && obj.startDate <= #dates.createToday() .....(省略) }"

大事なところは、Thymeleafへ日付を渡すときは、日付型(java.util.DateやCalendar)にしたほうがやりやすいでしょうか。

Thymeleafに渡す前に比較するのであれば、swordone様のやり方で十分問題ありません。

投稿2017/05/25 15:53

A-pZ

総合スコア12011

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

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

k499778

2017/05/25 20:57

回答ありがとうございます。 できればtymeleafで書きたいなとは思っていました。そしておっしゃってくださったように{}内に全て書く方法も試しました。 ただ「obj != null &&」を上記のif文内に組み込む方法がわからなくて断念しました。 「&&」になるので次の「${obj.flg} 」も見に行ってしまい「objがnull」のときエラーになっているように思います。 th:ifに「obj != null」の条件を組み込む書き方をもしご存知であれば教えていただけないでしょうか?
k499778

2017/05/25 21:00

自分なりの方法。 (前にobj !=nullを入れ、後ろの条件と区別するため後ろの条件を()で括った。 ただこれだとobj=nullのときobj.flgで落ちる気がする。) th:if="${obj != null && (obj.flg eq 1 and #dates.format(obj.startDate) le #dates.format(#dates.createToday()) and (obj.endDate eq null or #dates.format(#dates.creatToday()) le #dates.format(obj.endDate)))}"
k499778

2017/05/25 21:03

おっしゃる通りJava風に書くと th:if="${obj != null && (obj.flg == 1 && #dates.format(obj.startDate) <= #dates.format(#dates.createToday()) && (obj.endDate == null || #dates.format(#dates.creatToday()) <= #dates.format(obj.endDate)))}" 演算子はそのまま書けるんですね。 以下リンク修正する必要があると思っていました。 http://qiita.com/narikei/items/c4780d6bb69902380136
A-pZ

2017/05/25 21:11

obj != null && を先頭に書くことで、もしobjがnullだった場合は、後続の条件は評価されません。
A-pZ

2017/05/25 21:14

補足すると、演算子がそのまま使えるのは、Thymeleaf3からです。2.1系はELのように、eqやleなどになります。
k499778

2017/05/25 21:33

回答ありがとうございます。そうだったんですね。勘違いしていました。 thymeleafのバージョンに関しては2.1系でした。 であれば以下の書き方でいけますでしょうか。 全くこの通り書いたかどうかわかりませんが、昨日どこかで落ちたような。。 後続をまとめるため()で括っている部分もうまく動くか気になります。 th:if="${obj != null && (obj.flg eq 1 and #dates.format(obj.startDate) le #dates.format(#dates.createToday()) and (obj.endDate eq null or #dates.format(#dates.creatToday()) le #dates.format(obj.endDate)))}"
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問