• ベストアンサー

日付の書式の確認方法

こんにちは。 コンテンツの日付(手段はもう、いなくなった別の人に作ってもらったので不明) を抽出し、抽出された値がYYYY/MM/DD 形式になっているのか チェックをしたいです。 抽出された値は、変数$datechkに入っています 2008/9/23 13:59 そこで、下記のコードで試したのですが、 if($datechk.match(/^\d{4}\/\d{2}\/\d{2}$/)){OK;}else{NG;} if($datechk.match(/^\ggg年\mm月\dd日$/)){OK;}else{NG;} if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;} のいずれで実施しても「OK」が返ってきてしまいます。 何をやってもtrueになってしまうので正しく本当に書式チェックが されてない状態です。 恐れ入りますが、何が問題なのかご指摘頂けませんでしょうか。 また、とある値が文字列なのか、日付型なのか、チェックする方法は ございますでしょうか。 ご教授お願いしますm(__)m。

質問者が選んだベストアンサー

  • ベストアンサー
noname#84373
noname#84373
回答No.3

>なるほど、後ろの$の意味がが良くわかりました! >上記コードの結果は2008/09/02 12:34:56の内、2008/09/02が抽出されるのですね! 抽出されるのは、年、月、日、時、分、秒です >if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;} エラーは出ないけど、正規表現でggなんてあるの? >(ちなみに$datechkですが、$をつけないと変数の中身を参照できないと思います。。。) ってもしかしてPHPと勘違いしてませんか? 質問する前に、以下のような簡単なプログラムを書いて、実行して なぜ?なに?を確認してみてましょう! <html> <script> var datechk=$datechk='2008/09/02 12:34:56'; day=(datechk.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/)); alert('平成'+(day[1]-1988)+'年'+day[2]+'月'+day[3]+'日 '+day[4]+'時'+day[5]+'分'+day[6]+'秒'); alert(datechk.replace(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/,'$1-$2-$3')); if(String(datechk).match(/^ggg年mm月dd日$/)) alert('ok'); else alert('no'); datechk='h20/09/23'; if(datechk.match(/^[HhSsTtMm]\d{1,2}\/\d{1,2}\/\d{1,2}$/)) alert('和暦です'); if('p20/09/23'.match(/^[HhSsTtMm]\d{1,2}\/\d{1,2}\/\d{1,2}$/)) alert('和暦です'); else alert('何それ'); var s='更新日は、2008/09/23 に行われました'; if(s.match(/.*\d{4}\/\d{1,2}\/\d{1,2}.*/)) alert('西暦年が含まれています');else alert('何それ'); var s='更新日は、2008 / 09 /23 に行われました'; if(s.match(/.*\d{4}\/\d{1,2}\/\d{1,2}.*/)) alert('西暦年が含まれています');else alert('何それ'); </script>

tamamusi
質問者

お礼

pipi様 折角、取り急ぎのご回答を頂いたにも関わらず、 ご連絡が遅くなり大変申し訳ございませんでした。 小職にとってJavaScriptは始めたばかりのスクリプト言語 でして、思った以上に苦戦しております(現在も(汗))。 なので、このようなご解説を頂き、pipi様のお力に驚き、 感謝の気持ちでいっぱいになりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

noname#84373
noname#84373
回答No.2

>>実はすべてOKじゃなくてすべてNGになっているのでは? >について、詳細をご指摘頂けますでしょうか。 参照値が'2008/9/23 13:59' しかし、正規表現では、/^\d{4}\/\d{2}\/\d{2}$/になってます 無理くり日本語にすれば、 文字列の先頭が数字が4個あり、次に/があり、数字が2文字あり、 /があり、数字が2文字で、終了しているものと合っているか? この表記では、9月の文字が1つだけのとき合致しない。 まして、日は二文字あれば終わりでなければならないのに 時間がある。だからtrueを返えせない! もし最後の$が無い場合 2008/09/12345678 でも合致してしまう。 なので\d{1,2}を訳すと、数字が1文字以上2文字以下で合致する つまり9月でも09月でも合致する ちなみに alert('2008/09/02 12:34:56'.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/)); でそれぞれの値を配列で返す  

tamamusi
質問者

補足

pipi様 レスありがとうごあいます。 >2008/09/12345678 でも合致してしまう。 >なので\d{1,2}を訳すと、数字が1文字以上2文字以下で合致する >つまり9月でも09月でも合致する >ちなみに >alert('2008/09/02 12:34:56'.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/)); なるほど、後ろの$の意味がが良くわかりました! 上記コードの結果は2008/09/02 12:34:56の内、2008/09/02が抽出されるのですね! match関数で使うために、変数に入っている値を強制的に文字列に入れる (値の中身が何型かわからないので)に入れる方法は下記方法でよろしいでしょうか。 var datechk2=$datechk; ※$datechkには2008/09/02 12:34:56が入っている。 これを下記にあてはめる alert($datechk.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/)); で if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){OK;}else{NG;} でOKを返す。逆に if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;} ならNGになる (ちなみに$datechkですが、$をつけないと変数の中身を参照できないと思います。。。) との認識で宜しいでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

実はすべてOKじゃなくてすべてNGになっているのでは? その変数のあたまに$をつけるのをやめたほうがよいでしょう。 (他の言語と競合する可能性もあるので) <script> var datechk="2008/9/23 13:59"; if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){document.write(0);}else{document.write(1);} if(datechk.match(/^\d{4}\/\d{2}\/\d{2}$/)){document.write(0);}else{document.write(1);} if(datechk.match(/^\ggg年\mm月\dd日$/)){document.write(0);}else{document.write(1);} if(String (datechk).match(/^ggg年mm月dd日$/)){document.write(0);}else{document.write(1);} </script>

tamamusi
質問者

補足

yambejpさま こんにちは。早速のご回答ありがとうございます。 >その変数のあたまに$をつけるのをやめたほうがよいでしょう ご指摘ありがとうございます。 但し、既に別の方が書かれた変数にあらかじめ入っており、 いまのところそこからしか抽出する方法がないので、 下記方法で対応しようと思います。 var datechk2=$datechk; また、大変恐れ入りますが、 >実はすべてOKじゃなくてすべてNGになっているのでは? について、詳細をご指摘頂けますでしょうか。 少なくともはじめのコードについては正確なURLはおぼえておりませんが、サンプル集より採用したものであり、問題点が私の力では見つかりません。 if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){document.write(0);}else{document.write(1);} 但し、上記については、秒まで指定してないのに、OKになってしまうのが不思議です。 2行目以降は私のほうで手を加えましたのが、なぜか、値の書式(2008/9/23 13:59)と異なるもの(\ggg年\mm月\dd日)で比較 しようとしているので、NGを返してほしいのですが、 OKになってしまいます。 当方の勉強不足ですが、使用方法含め、誤りのご指摘を頂けませんでしょうかm(__)m。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 入力された日付の正規表現の仕方を教えて下さい。

    こんばんは、いつもお世話になっております。 過去ログをあさってみたのですが、探し方が悪いのか 見つけられず…。 どうかご指導よろしくお願い申し上げます。 フォームに入力された値のチェックを、CGIに渡す前に ジャバスクリプトでもチェックしたいと思っています。 未入力や半角英数字以外のエラーチェックは出来たのですが yyyy/mm/dd形式で日付の入力をして欲しい時の チェックの書き方がわかりません。 私なりに色々と調べてみて、 if(myForm.day.value.match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と記述してみたのですが、9999/99/99のような、ありえない 日付でも通ってしまいます。 そればらば、とおもい if(myForm.day.value.match(/^[2-3][0-9][0-9][0-9]\/[0-1][0-9]\/[0-3][0-9]$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と書いてみたのですが、こちらはエラーが出ました(泣) どうか、ご指導よろしくお願い申し上げます。

  • Excel97の日付の書式設定

    現在Excel97で日付入力をしたいのですが、 最終的に演算に使用する日付で yyyy/mm/ddとyyyy/mmどちらでも入力できる書式設定を探しています。 yyyy/mm/ddの指定にするとyyyy/mmと入力してもyyyy/mm/01となってしまいます。 yyyy/mmのセルとdd専用のセルを別に作ると、ddを入力した時に 閏年のエラーチェックなどがかけられないので演算部分(1年後該当日前日の指定等)がうまく働きません。 いい方法がありましたら教えてください。

  • ACCESS日付形式について質問です。

    日付抽出条件を含んだフォームを作成したのですが、午前中までyyyy/mm/ddの形式で入力し、抽出できたのですが、今mm/ddの形式で入力しないと抽出できなくなりました。 変更をした覚えはないのですが・・・ yyyy/mm/ddで抽出できる方法を教えてください。 おねがいします。

  • 日付型→文字列

    SQLServer2005の環境にて、 日付型の項目(YYYY/MM/DD HH:MM:SS)から日付のみを抽出したい場合、 現在SUBSTRING(CONVERT(VARCHAR,AA),1,10) と変換を行っているのですが、結果が「MM DD YYYY」となってしまいます。 「YYYY/MM/DD」の形式で取得するにはどのようなSQL文にすればよろしいのでしょうか。

  • Excel vba 日付の形式判定

    Excelに日付、開始時間の列があります。 セルの形式をチェックしたいのですが、形式が下記のとおりであるか どう記述すればいいのでしょうか? 日付チェックはisdate関数を使いますが、日付の形式がyyyy/mm/dd、時間の形式がhh:mmであるかの 判定方法を教えてほしいです。 例) 日付    時間  2021/05/01 10:00  H33/05/01   ← yyyy/mm/dd形式でない為、NG   10時00分 ← hh:mm形式でない為、NG 

  • 日付の書式

    Excel2010でA列の日付の書式をB列に「[$-411]ge.mm.dd」、C列に「yyyy.mm,dd」の書式に変換したい。 B列、C列のB1,C1に「=IF(A1="","",A1)」の式を使用し、下方向にコピーした。 A列2012.1.1、2012.2.25、2912.12.31の日付はB,C列に変換されない。 A列2012.01,01、2012.02.25はB列が変化しない。 書式を変化させる方法はありますか

  • エクセルVBA セルの書式につい

    ユーザーフォームのテキストボックスに入力した日付(yyyy/mm/ddの形式)をA1セルに入れるとします。  Range("A1").Value = Me.txt日付 A1セルの表示形式は書式設定でユーザー定義の"d"で表示されるように設定していますが、 テキストボックスに入力した形式のまま(yyyy/mm/dd)でA1セルに表示されてしまいます。 上記のみではNGでしょうか? ちなみに、yyyy/mm/ddと入力されたA1セルを一旦編集モード([F2]キーを押した状態)にして[Enter]を押すと"d"(書式設定で指定している書式)に変わります。 参考:A1セルの日付をみて別シートの一覧からVlookup関数で値を検索したいところが、yyyy/mm/ddで表示されるためにエラーとなってしまいます) ご存知の方教えていただきたいです。

  • 日付型の入力値チェック

    こんにちは。 下記のようなフォーマットで日付型のチェックをしたいと 思っています。最低限(1)YYYYが入力されていればOKで、 最高だと(8)YYYY-MM-DDThh:mm:ss.sTZDまで入力可能です。 この日付が妥当であれるかどうかの判定はどのように するのが良いでしょうか? YYYY[-MM[-DD[Thh[:mm[:ss[.s[TZD]]]]]]] (1)YYYY (2)YYYY-MM (3)YYYY-MM-DD (4)YYYY-MM-DDThh (5)YYYY-MM-DDThh:mm (6)YYYY-MM-DDThh:mm:ss (7)YYYY-MM-DDThh:mm:ss.s (8)YYYY-MM-DDThh:mm:ss.sTZD ちょっと考えたのは、まず、長さを見て各文字列を パースして各場所の数値の妥当性をチェックって 言うものです。これでも出来そうな気もしますが、 他にも良いやり方などありましたら、 ご教示宜しくお願い致します。

    • ベストアンサー
    • Java
  • アクセスで日付の書式が書き直されます。

    Access97での書式で日付についてお尋ねします。 テキストボックスの書式で、 yyyy\年mm\月d\週 と入力すると、強制的に yyyy"年"mm"月"d"週" となってしまい、表示も本来 2007年08月1週 となるところ、 2007mm月d週 と成ってしまいます。 このファイルをAccess2002で開くと、 yyyy\年mm\月d\週 のままです。 Access97の設定に寄るもではないかと思うのですが、分かりません。 どなたか、ご存じの方がいらっしゃれば、ご教授の程、お願いいたします。

  • クリスタルレポートの式フィールドで日付変換。

    クリスタルレポート8の式フィールドで日付を表示させようと思っています。 標準では『YYYY/MM/DD』形式なのですがこれを『YYYY-MM-DD』で表示させたいのですがうまくいきません。 式フィールドには if A ="1" then formula = CurrentDate と記述しています。 Aの値が"1"ならば日付を表示です。 説明が下手で分かりづらいかもしれませんが、 補足しますのでヨロシクお願いします。