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

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

ただいまの
回答率

88.92%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,866

k499778

score 542

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

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

th: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」という形式で値が入っています。

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

SampleEntity obj = new SampleEntity();

    public boolean getFlg(){
        if(obj == null){
            return false;
        }
        if(obj.flg == 1 && obj.startDate <= 今日の日にち && (obj.endDate == null || 今日の日にち <= obj.endDate )  ){
            return true;
        }
        return false;
    }

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


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

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

public class Sample {

    public static void main(String[] args) throws ParseException {
        Sample s = new Sample();
        System.out.println(s.getFlg());

    }

    SampleEntity obj = new SampleEntity();

    public boolean getFlg() throws ParseException {

        // SampleEntity obj = new SampleEntity();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        // obj.startDate = format.parse("2007-01-01");
        // obj.endDate = format.parse("2017-05-26");
        // obj.flg = 1;

        Date now = new Date();
        now = format.parse(now.toString());
        int diff1 = now.compareTo(obj.startDate);
        int diff2 = obj.endDate.compareTo(now);

        if (obj == null) {
            return false;
        }
        if (obj.flg == 1 && diff1 >= 0 && (obj.endDate == null || diff2 >= 0)) {
            return true;
        }
        return false;
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 06:13

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

    キャンセル

0

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/26 06:11

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

    キャンセル

  • 2017/05/26 06:14

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

    キャンセル

  • 2017/05/26 06: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)))}"

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る