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

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

ただいまの
回答率

88.92%

Java プルダウンで選択した年月日時分と日にちの比較

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 217

AA53

score 26

javaでbeanを用いてプルダウンで選択した値の比較をしています。
以下、困っている事を含めまとめましたのでよろしくお願いいたします。

画面

  • 日付指定K:年月日時分(プルダウンで選択)
  • 日付指定I:年月日時分(プルダウンで選択)
  • オプション指定O:1日、2日、3日、1週間、2週間(プルダウンで選択)+0-23時(プルダウンで選択)

エラー、OKの条件

  • OK
    日付指定K<オプション指定O<日付指定I

  • エラー
    上記大小関係が崩れた場合(日付指定Kと日付指定Iの比較は他のメソッドで作成済)

対応したこと

オプション指定Oは、数値に変換しvalueにはそれぞれ00,02,03,07,14と変換し
日付指定Kと日付指定Iでは正確な判定ができた

困っている事

オプション指定O<日付指定IならOK。そうでなければNGとしたいが、
オプション指定Oをどう判定するべきか。

日付指定I - オプション指定Oで指定した日(00・・・14


で比較すると、指定した時間をどう設定したらいいのか。

ソース

public static String ck100(Locale locale, Calendar date1, Calendar date2, String Name) {
//(比較する値)と(比較される値)を比較
int i = date1.compareTo(date2);
if (i >= 0) {
    return getMessage(locale, "MSG10", new Object[] { Name });
}
return null;
}

protected void checkRange() {

if (bbsBean.getDays01() != null || bbsBean.getRmd01() != null) {
    Calendar evDate = null;
    DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmm");
    try {
        evDate = UiUtils.createCalendar(formatter
                .parse(bbsBean.getEvYear() + bbsBean.getEvMonth()
                        + bbsBean.getEvDay() + bbsBean.getEvTime()
                        + bbsBean.getEvMinute()).getTime());
    } catch (ParseException e) {
        log.error("エラーです。", e);
    }

    Calendar rmDate = null;
    if (bbsBean.getR01() != null && bbsBean.getR01()) {
        rmDate = Calendar.getInstance();
    } else {
        try {
            rmDate = UiUtils.createCalendar(formatter
                    .parse(bbsBean.getRDays() + bbsBean.getRHour() + "00")
                    .getTime());
        } catch (ParseException e) {
            log.error("エラーです", e);
        }
    }

    // 日時の大小をチェック
    String errorMessage = ck10(getLocale(),
            rmDate, evDate,
            getText("エラーです"));
    if (errorMessage != null) {
        addErrorMessage(errorMessage);
    }
}
}

checkRng() {
protected void checkRange();
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • AA53

    2020/07/21 23:11

    >1日前だと(8/20 10時)になりますよね?
    失礼しました。おっしゃる通りです。
    >これは、2020/08/21 10時 ー 2週間前の10時(8/7 10時)という意味ですよね?
    はい。その通りです

    キャンセル

  • LOVE-KANON

    2020/07/21 23:16

    かしこまりました。
    ちょっとコード書いてみますね。

    キャンセル

  • AA53

    2020/07/21 23:17

    すみません。遅くに。ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

+1

いろいろ検証していたら遅くなりました。
申し訳ございません。

以下書いてみましたが、いかがでしょうか。
(lombokなど入れてないのでgetter, setter直書きで見づらいです。すみません。)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Main {
    public static void main(String[] args) {
        try {
            TestBean bean = new TestBean();

            // 日付指定K
            bean.setkYear("2020");
            bean.setkMonth("08");
            bean.setkDay("20");
            bean.setkHour("10");
            bean.setkMinute("00");

            // 日付指定I
            bean.setiYear("2020");
            bean.setiMonth("08");
            bean.setiDay("22");
            bean.setiHour("10");
            bean.setiMinute("00");

            // オプションO
            bean.setoDay("2日前");
            bean.setoHour("09");

            String message = checkRange(bean);
            if (message == null) {
                System.out.println("エラーなし");
            } else {
                System.out.println(message);
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    private static String checkRange(TestBean bean) throws ParseException {
        String message = null;

        // 指定日付IをCalenderに変換
        Calendar iDate = new GregorianCalendar();
        iDate.set(
                Integer.parseInt(bean.getiYear()),
                Integer.parseInt(bean.getiMonth()),
                Integer.parseInt(bean.getiDay()),
                Integer.parseInt(bean.getiHour()),
                Integer.parseInt(bean.getiMinute()));

        // 指定日付KをCalenderに変換
        String kString = bean.getkYear() + bean.getkMonth() + bean.getkDay() + bean.getkHour() + bean.getkMinute();
        Calendar kDate = new GregorianCalendar();
        kDate.set(
                Integer.parseInt(bean.getkYear()),
                Integer.parseInt(bean.getkMonth()),
                Integer.parseInt(bean.getkDay()),
                Integer.parseInt(bean.getkHour()),
                Integer.parseInt(bean.getkMinute()));

        // オプション比較用のベースとなる日付設定
        // 指定日付Kの年月日 + オプションOの時 + 指定日付Kの分(ここでは202008220900が設定される)
        String oString = bean.getiYear() + bean.getiMonth() + bean.getiDay() + bean.getoHour() + bean.getiMinute();
        Calendar oDate = new GregorianCalendar();
        oDate.set(
                Integer.parseInt(bean.getiYear()),
                Integer.parseInt(bean.getiMonth()),
                Integer.parseInt(bean.getiDay()),
                Integer.parseInt(bean.getoHour()),        // 時間のみオプションの時間を設定
                Integer.parseInt(bean.getiMinute()));
        // 上記日付をマイナスする
        if (OptionEnum.getDayFromLabel(bean.getoDay()) != null) {
            oDate.add(Calendar.DAY_OF_MONTH, - OptionEnum.getDayFromLabel(bean.getoDay()).getDayValue());
        }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        System.out.println("指定日付K = " + sdf.format(kDate.getTime()));
        System.out.println("指定日付I = " + sdf.format(iDate.getTime()));
        System.out.println("指定日付I - オプションO = " + sdf.format(oDate.getTime()));

        /*
         *  指定日付Iと指定日付Kの比較
         */
        if (iDate.compareTo(kDate) < 0) {
            // 指定日付I < 指定日付K の場合エラー
            return "指定日付I・指定日付K相関エラー";
        } else if (oDate.compareTo(kDate) < 0) {
            // (指定日付I - オプションO) < 指定日付K の場合エラー
            return "オプション値の整合性エラー";
        }
        return null;
    }
}
public class TestBean {
    private String kYear;
    private String kMonth;
    private String kDay;
    private String kHour;
    private String kMinute;
    private String iYear;
    private String iMonth;
    private String iDay;
    private String iHour;
    private String iMinute;
    private String oDay;
    private String oHour;

    public String getkYear() {
        return kYear;
    }
    public void setkYear(String kYear) {
        this.kYear = kYear;
    }
    public String getkMonth() {
        return kMonth;
    }
    public void setkMonth(String kMonth) {
        this.kMonth = kMonth;
    }
    public String getkDay() {
        return kDay;
    }
    public void setkDay(String kDay) {
        this.kDay = kDay;
    }
    public String getkHour() {
        return kHour;
    }
    public void setkHour(String kHour) {
        this.kHour = kHour;
    }
    public String getkMinute() {
        return kMinute;
    }
    public void setkMinute(String kMinute) {
        this.kMinute = kMinute;
    }
    public String getiYear() {
        return iYear;
    }
    public void setiYear(String iYear) {
        this.iYear = iYear;
    }
    public String getiMonth() {
        return iMonth;
    }
    public void setiMonth(String iMonth) {
        this.iMonth = iMonth;
    }
    public String getiDay() {
        return iDay;
    }
    public void setiDay(String iDay) {
        this.iDay = iDay;
    }
    public String getiHour() {
        return iHour;
    }
    public void setiHour(String iHour) {
        this.iHour = iHour;
    }
    public String getiMinute() {
        return iMinute;
    }
    public void setiMinute(String iMinute) {
        this.iMinute = iMinute;
    }
    public String getoDay() {
        return oDay;
    }
    public void setoDay(String oDay) {
        this.oDay = oDay;
    }
    public String getoHour() {
        return oHour;
    }
    public void setoHour(String oHour) {
        this.oHour = oHour;
    }
}
public enum OptionEnum {
    DAY_1("1日前", 0),
    DAY_2("2日前", 2),
    DAY_3("3日前", 3),
    WEEK_1("1週間前", 7),
    WEEK_2("2週間前", 14);

    private String label;
    private int dayValue;

    private OptionEnum(String label, int dayValue) {
        this.label = label;
        this.dayValue = dayValue;
    }

    public String getLabel() {
        return label;
    }

    public int getDayValue() {
        return dayValue;
    }

    public static OptionEnum getDayFromLabel(String label) {
        for (OptionEnum optionEnum : OptionEnum.values()) {
            if (optionEnum.getLabel().equals(label)) {
                return optionEnum;
            }
        }
        return null;
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/27 13:31

    構わないですよー。
    jspを使用しているんですよね?
    springなどのフレームワークは使用していないのでしょうか?

    キャンセル

  • 2020/07/29 11:31

    LOVE-KANONさん、アドバイス通りに実装したところできました!(Beanは少し変更しました)
    時間がかかってすみません。
    フレームワークは、Strutsです。なかなか古いもののようですがJavaの理解が浅いため質問が稚拙で遅くて申し訳ございませんでした。

    キャンセル

  • 2020/07/29 11:55

    > (Beanは少し変更しました。)

    こちらはやり方だけ提示しているので、
    細かい箇所は環境に合わせていただいて構わないです。

    strutsだったのですね!
    できたのならよかったです!

    次回以降は質問のタグにstrutsなども追加すると、より回答が得られやすいかもですね!

    キャンセル

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

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

関連した質問

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