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

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

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

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

Q&A

解決済

1回答

2108閲覧

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

roro_mochi

総合スコア48

Java

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

0グッド

0クリップ

投稿2020/07/21 09:56

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)

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

ソース

Java

1public static String ck100(Locale locale, Calendar date1, Calendar date2, String Name) { 2//(比較する値)と(比較される値)を比較 3int i = date1.compareTo(date2); 4if (i >= 0) { 5 return getMessage(locale, "MSG10", new Object[] { Name }); 6} 7return null; 8} 9 10protected void checkRange() { 11 12if (bbsBean.getDays01() != null || bbsBean.getRmd01() != null) { 13 Calendar evDate = null; 14 DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmm"); 15 try { 16 evDate = UiUtils.createCalendar(formatter 17 .parse(bbsBean.getEvYear() + bbsBean.getEvMonth() 18 + bbsBean.getEvDay() + bbsBean.getEvTime() 19 + bbsBean.getEvMinute()).getTime()); 20 } catch (ParseException e) { 21 log.error("エラーです。", e); 22 } 23 24 Calendar rmDate = null; 25 if (bbsBean.getR01() != null && bbsBean.getR01()) { 26 rmDate = Calendar.getInstance(); 27 } else { 28 try { 29 rmDate = UiUtils.createCalendar(formatter 30 .parse(bbsBean.getRDays() + bbsBean.getRHour() + "00") 31 .getTime()); 32 } catch (ParseException e) { 33 log.error("エラーです", e); 34 } 35 } 36 37 // 日時の大小をチェック 38 String errorMessage = ck10(getLocale(), 39 rmDate, evDate, 40 getText("エラーです")); 41 if (errorMessage != null) { 42 addErrorMessage(errorMessage); 43 } 44} 45} 46 47checkRng() { 48protected void checkRange(); 49} 50

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/21 13:34 編集

オプション指定O<日付指定IならOK。そうでなければNGとしたいが、 オプション指定Oをどう判定するべきか。 ↑ オプション指定Oは日時のフィールドで、日付指定Iは年月日時分のフィールドとのことですが 上記の比較はどのように行うのでしょうか? オプション指定Oについての内容がいまいち理解できません、、
roro_mochi

2020/07/21 13:56

わかりにくくてすみません。 ◆日付指定Kと日時指定の比較(OK例) 日付指定K 入力例)2020/08/20 10時 日時指定I 入力例)2020/08/21 10時 日付指定K< 日時指定I なのでOK ◆日時指定Iとオプション指定Oの比較(NG例) 日付指定K 入力例)2020/08/20 10時 日時指定I 入力例)2020/08/21 10時 オプション指定O 入力例)2週間前 10時(8/7 10時) 日付指定K<オプション指定O<日付指定I が成立しないのでNG ◆日時指定Iとオプション指定Oの比較(OK例) 日付指定K 入力例)2020/08/20 10時 日時指定I 入力例)2020/08/21 10時 オプション指定O 入力例)1日 10時(8/14 10時) 日付指定K<オプション指定O<日付指定I が成立するのでOK オプションはアラート機能のつもりでした。 日付指定Iより過去、日付指定Kより未来を正としたいのですが、 おっしゃる通りオプション指定Oの入力規則が他と異なるのでどう扱うべきか思案しています。 日付指定I - オプション指定O 引いた日付が日付指定Kより大きければOK。でよいかと思っていますが、 その場合、プルダウンをどう取得するか困っています。
退会済みユーザー

退会済みユーザー

2020/07/21 14:04 編集

おそらく自分の思っていることが正しいのであれば、 「日付指定I - オプション指定O 引いた日付が日付指定Kより大きければOK」 でいいのだと思いますが、 ◆日時指定Iとオプション指定Oの比較(OK例) 日付指定K 入力例)2020/08/20 10時 日時指定I 入力例)2020/08/21 10時 オプション指定O 入力例)1日 10時(8/14 10時) ↑ これの1日というのは何を指しているのでしょうか? 1日前だと(8/20 10時)になりますよね? ◆日時指定Iとオプション指定Oの比較(NG例) 日付指定K 入力例)2020/08/20 10時 日時指定I 入力例)2020/08/21 10時 オプション指定O 入力例)2週間前(14日前)の 10時(8/7 10時) これは、2020/08/21 10時 ー 2週間前の10時(8/7 10時) という意味ですよね?
roro_mochi

2020/07/21 14:11

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

退会済みユーザー

2020/07/21 14:16

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

2020/07/21 14:17

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

回答1

0

ベストアンサー

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

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

Main

1import java.text.ParseException; 2import java.text.SimpleDateFormat; 3import java.util.Calendar; 4import java.util.GregorianCalendar; 5 6public class Main { 7 public static void main(String[] args) { 8 try { 9 TestBean bean = new TestBean(); 10 11 // 日付指定K 12 bean.setkYear("2020"); 13 bean.setkMonth("08"); 14 bean.setkDay("20"); 15 bean.setkHour("10"); 16 bean.setkMinute("00"); 17 18 // 日付指定I 19 bean.setiYear("2020"); 20 bean.setiMonth("08"); 21 bean.setiDay("22"); 22 bean.setiHour("10"); 23 bean.setiMinute("00"); 24 25 // オプションO 26 bean.setoDay("2日前"); 27 bean.setoHour("09"); 28 29 String message = checkRange(bean); 30 if (message == null) { 31 System.out.println("エラーなし"); 32 } else { 33 System.out.println(message); 34 } 35 36 } catch (ParseException e) { 37 e.printStackTrace(); 38 } 39 } 40 41 private static String checkRange(TestBean bean) throws ParseException { 42 String message = null; 43 44 // 指定日付IをCalenderに変換 45 Calendar iDate = new GregorianCalendar(); 46 iDate.set( 47 Integer.parseInt(bean.getiYear()), 48 Integer.parseInt(bean.getiMonth()), 49 Integer.parseInt(bean.getiDay()), 50 Integer.parseInt(bean.getiHour()), 51 Integer.parseInt(bean.getiMinute())); 52 53 // 指定日付KをCalenderに変換 54 String kString = bean.getkYear() + bean.getkMonth() + bean.getkDay() + bean.getkHour() + bean.getkMinute(); 55 Calendar kDate = new GregorianCalendar(); 56 kDate.set( 57 Integer.parseInt(bean.getkYear()), 58 Integer.parseInt(bean.getkMonth()), 59 Integer.parseInt(bean.getkDay()), 60 Integer.parseInt(bean.getkHour()), 61 Integer.parseInt(bean.getkMinute())); 62 63 // オプション比較用のベースとなる日付設定 64 // 指定日付Kの年月日 + オプションOの時 + 指定日付Kの分(ここでは202008220900が設定される) 65 String oString = bean.getiYear() + bean.getiMonth() + bean.getiDay() + bean.getoHour() + bean.getiMinute(); 66 Calendar oDate = new GregorianCalendar(); 67 oDate.set( 68 Integer.parseInt(bean.getiYear()), 69 Integer.parseInt(bean.getiMonth()), 70 Integer.parseInt(bean.getiDay()), 71 Integer.parseInt(bean.getoHour()), // 時間のみオプションの時間を設定 72 Integer.parseInt(bean.getiMinute())); 73 // 上記日付をマイナスする 74 if (OptionEnum.getDayFromLabel(bean.getoDay()) != null) { 75 oDate.add(Calendar.DAY_OF_MONTH, - OptionEnum.getDayFromLabel(bean.getoDay()).getDayValue()); 76 } 77 78 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); 79 System.out.println("指定日付K = " + sdf.format(kDate.getTime())); 80 System.out.println("指定日付I = " + sdf.format(iDate.getTime())); 81 System.out.println("指定日付I - オプションO = " + sdf.format(oDate.getTime())); 82 83 /* 84 * 指定日付Iと指定日付Kの比較 85 */ 86 if (iDate.compareTo(kDate) < 0) { 87 // 指定日付I < 指定日付K の場合エラー 88 return "指定日付I・指定日付K相関エラー"; 89 } else if (oDate.compareTo(kDate) < 0) { 90 // (指定日付I - オプションO) < 指定日付K の場合エラー 91 return "オプション値の整合性エラー"; 92 } 93 return null; 94 } 95}

TestBean

1public class TestBean { 2 private String kYear; 3 private String kMonth; 4 private String kDay; 5 private String kHour; 6 private String kMinute; 7 private String iYear; 8 private String iMonth; 9 private String iDay; 10 private String iHour; 11 private String iMinute; 12 private String oDay; 13 private String oHour; 14 15 public String getkYear() { 16 return kYear; 17 } 18 public void setkYear(String kYear) { 19 this.kYear = kYear; 20 } 21 public String getkMonth() { 22 return kMonth; 23 } 24 public void setkMonth(String kMonth) { 25 this.kMonth = kMonth; 26 } 27 public String getkDay() { 28 return kDay; 29 } 30 public void setkDay(String kDay) { 31 this.kDay = kDay; 32 } 33 public String getkHour() { 34 return kHour; 35 } 36 public void setkHour(String kHour) { 37 this.kHour = kHour; 38 } 39 public String getkMinute() { 40 return kMinute; 41 } 42 public void setkMinute(String kMinute) { 43 this.kMinute = kMinute; 44 } 45 public String getiYear() { 46 return iYear; 47 } 48 public void setiYear(String iYear) { 49 this.iYear = iYear; 50 } 51 public String getiMonth() { 52 return iMonth; 53 } 54 public void setiMonth(String iMonth) { 55 this.iMonth = iMonth; 56 } 57 public String getiDay() { 58 return iDay; 59 } 60 public void setiDay(String iDay) { 61 this.iDay = iDay; 62 } 63 public String getiHour() { 64 return iHour; 65 } 66 public void setiHour(String iHour) { 67 this.iHour = iHour; 68 } 69 public String getiMinute() { 70 return iMinute; 71 } 72 public void setiMinute(String iMinute) { 73 this.iMinute = iMinute; 74 } 75 public String getoDay() { 76 return oDay; 77 } 78 public void setoDay(String oDay) { 79 this.oDay = oDay; 80 } 81 public String getoHour() { 82 return oHour; 83 } 84 public void setoHour(String oHour) { 85 this.oHour = oHour; 86 } 87}

OptionEnum

1public enum OptionEnum { 2 DAY_1("1日前", 0), 3 DAY_2("2日前", 2), 4 DAY_3("3日前", 3), 5 WEEK_1("1週間前", 7), 6 WEEK_2("2週間前", 14); 7 8 private String label; 9 private int dayValue; 10 11 private OptionEnum(String label, int dayValue) { 12 this.label = label; 13 this.dayValue = dayValue; 14 } 15 16 public String getLabel() { 17 return label; 18 } 19 20 public int getDayValue() { 21 return dayValue; 22 } 23 24 public static OptionEnum getDayFromLabel(String label) { 25 for (OptionEnum optionEnum : OptionEnum.values()) { 26 if (optionEnum.getLabel().equals(label)) { 27 return optionEnum; 28 } 29 } 30 return null; 31 } 32}

投稿2020/07/21 16:11

編集2020/07/21 16:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/07/21 16:17

とりあえず緊急対応として、オプションの日のint値はEnumで取得してます。 (ここの部分はできているとのことですので、無視してください。) 日付指定K < (日付指定I - オプション指定O(日)) で比較してます。 オプション指定O(時)について認識が合っているか不明でしたが、 上記比較時の時間に設定してます。
roro_mochi

2020/07/27 04:26

LOVE-KANONさん、お返事ありがとうございます。 水曜日時間切れで出来ず朝対応してみました。 一部、SimpleDateFormatの取り方がまずくそこをやり直してから教えていただいた内容で挑戦してみます。遅くなり申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2020/07/27 04:31

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

2020/07/29 02:31

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

退会済みユーザー

2020/07/29 02:55

> (Beanは少し変更しました。) こちらはやり方だけ提示しているので、 細かい箇所は環境に合わせていただいて構わないです。 strutsだったのですね! できたのならよかったです! 次回以降は質問のタグにstrutsなども追加すると、より回答が得られやすいかもですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問