function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
k_ogawak_ogawa 

日付項目のチェック

お世話になっております。

ApexとVisualforceで日付の入力項目を作成しているのですが、
登録ボタンを押下した際に入力チェックを行いたいと考えております。

チェック項目としては
・日付が存在する日付か
・YYYY/MM/DDの形で入力されているか
・半角数字か
です。

必須項目なので、
if(this.StartDateText == null)とすることで入力されているか否かの判断はできたのですが、
上記3つの処理の判定法方がわかりません。

ご存知の方、ご教授いただけないでしょうか。
よろしくお願い致します。
Best Answer chosen by k_ogawa
Shingo YamazakiShingo Yamazaki
k_ogawaさん

こんにちは。
山﨑です。

「テキストボックスに入力された任意の文字列が、Date型に変換可能か判断する」
という仕様でよろしければ以下のような方法が考えられると思います。

// ボタンを押した時に押されるメソッド
public PageReference submit() {
  // テキストに入力された値がthis.startDateTextに渡されているとして
  try {
    Date d = Date.parse(this.startDateText);
  // 正常な処理
  } catch (TypeException e) {
    // エラー処理
  }
}
注意点として、Date.parseの際に判断基準となるフォーマットは
local date formatに依存するとあります。

https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_date.htm#apex_System_Date_parse

このlocal date format とはユーザーの設定画面における「地域」です。
(試しに、地域を「アメリカ合衆国」などに変更するとMM/dd/yyyy形式しか受け付けなくなります)

パッケージとして他の組織に配布しようとお考えのようでしたら、気をつけないといけないかもしれませんね。

All Answers

k_ogawak_ogawa
追記です。
チェック項目を3つほど挙げましたが、単純に日付がtureかfalseかだけ判断
できれば入力チェックになるので、その判断法方がございましたらお教えください。
Shingo YamazakiShingo Yamazaki
k_ogawaさん

こんにちは。
山﨑です。

「テキストボックスに入力された任意の文字列が、Date型に変換可能か判断する」
という仕様でよろしければ以下のような方法が考えられると思います。

// ボタンを押した時に押されるメソッド
public PageReference submit() {
  // テキストに入力された値がthis.startDateTextに渡されているとして
  try {
    Date d = Date.parse(this.startDateText);
  // 正常な処理
  } catch (TypeException e) {
    // エラー処理
  }
}
注意点として、Date.parseの際に判断基準となるフォーマットは
local date formatに依存するとあります。

https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_date.htm#apex_System_Date_parse

このlocal date format とはユーザーの設定画面における「地域」です。
(試しに、地域を「アメリカ合衆国」などに変更するとMM/dd/yyyy形式しか受け付けなくなります)

パッケージとして他の組織に配布しようとお考えのようでしたら、気をつけないといけないかもしれませんね。
This was selected as the best answer
Taiki YoshikawaTaiki Yoshikawa
こんにちは。
自分も文字列の日付は try-catch で判定するのが簡単でいいと思います。

文字列の日付変換はDate.valueOfも便利です。
こちらは地域が変更されてもyyyy/MM/ddのままで判定できるので便利だと思います。

CommonDateみたいな共通クラスにこんな感じの処理を用意して対応するのがいいんじゃないかと思います。
/**
 * 対象文字列の日付判定
 */
public static Boolean isDate(String prmDate) {
        
    try {
        Date target = toDate(prmDate);
     } catch (Exception e) {
         return false;
     }
        
      return true;
}

/**
 * 文字列日付を日付型に変換
 */
public static Date toDate(String prmDate) {
        
    if (String.isEmpty(prmDate)) {
        return null;
    }
    return Date.valueOf(prmDate.replace('/', '-'));
}

こんな感じのテストコードで検証してます。
/**
 * 対象文字列の日付判定
*/
static testMethod void isDateTest() {
    
    System.runAs(testAdminUser) {
        Test.startTest();
        
        // 値なし
        Boolean result = CommonDate.isDate('');
        System.assertEquals(result, true);
        
        // 日付
        result = CommonDate.isDate('2014/01/01');
        System.assertEquals(result, true);
        
        // 日付以外
        result = CommonDate.isDate('Hello!!');
        System.assertEquals(result, false);
        
        Test.stopTest();
    }
}

/**
 * 文字列日付を日付型に変換
 */
static testMethod void toDateTest() {
    
    System.runAs(testAdminUser) {
        Test.startTest();
        
        // 値あり
        Date result = CommonDate.toDate('2014/05/10');
        System.assertEquals(result, Date.newInstance(2014, 5, 10));
        
        // 値なし
        result = CommonDate.toDate('');
        System.assertEquals(result, null);
        
        Test.stopTest();
    }
}


k_ogawak_ogawa
山﨑 様
いつもお世話になっております。

頂いたサンプルを基に作ってみたところ、理想の動きになりました。
最初、『Date d = Date.parse(this.startDateText);』の部分でエラーが出ていてハマりかけましたが、
this.startDateTextをDate型で宣言していた為エラーになっていたようです。
無事解決しました。

いつも的確なアドバイスありがとうございます。
k_ogawak_ogawa
Taiki 様
いつもお世話になっております。

サンプルを頂いたばかりか、検証までして頂きありがとうございます。
ただ、私には共通クラスの作り方、使い方がいまひとつ理解できていないため、
今回はこちらの方法はとらずに作成いたしました。

日付変換の箇所につきましては、Date.valueOfを採用させて頂きました。

お忙しい中質問に応えていただきありがとうございます。
BestAnswerについては山﨑様とさせて頂くことをご了承ください。

またどうぞよろしくお願い致します。