VB.NET IsDate関数の日付判定仕様について

Shiraishi 0 評価のポイント
2026-08-10T01:08:18.8433333+00:00

VB.NET IsDate関数の日付判定仕様について

VB.NETで開発しているシステムの日付チェック処理について、IsDate関数の仕様を確認したく問い合わせいたします。

  1. 発生している事象

日付項目の入力チェックにVB.NETのIsDate関数を使用しています。

本システムでは、日付項目としてyyyyMMdd、yyMMdd、和暦等の形式を想定しており、それ以外の値はエラーとする想定です。

しかし、以下の値について、

IsDate("z0260728")

を実行するとTrueとなります。

z0260728は通常の日付形式としては不正な値と考えていますが、VB.NETでは日付として解釈されます。

調査したところ、先頭のzが日付の年を示す文字として解釈され、

z0260728

26年7月28日

のように処理されているものと考えています。

  1. 確認したい事項

以下についてご教示ください。

IsDate("z0260728")がTrueとなる理由について、VB.NET/.NETの仕様上どのような規則で日付として解釈されているのでしょうか。

先頭のzを年を示す文字として解釈することは、IsDateの正式な仕様でしょうか。

この日付文字列の解釈は、.NET Framework / .NETのバージョンやOSの地域設定、CultureInfo等によって変化する可能性がありますでしょうか。

VB6にもIsDate関数がありますが、VB6とVB.NETではIsDateの日付文字列の解釈規則に仕様上の差異がありますでしょうか。

IsDateは「指定した日付形式に一致しているか」を判定する関数ではなく、「文字列を何らかの日付として解釈できるか」を判定する関数と考えるべきでしょうか。

yyyyMMdd、yyMMdd、和暦等の特定の形式のみを許容し、それ以外をエラーとする場合、IsDate以外に推奨される日付チェック方法があればご教示ください。

  1. VB6からVB.NETへの移行について

本システムは、旧システムではVB6を使用しており、その後VB.NETへ移行しています。

日付チェック処理では旧システム、新システムともにIsDateを使用していますが、入力値によっては判定結果に差異が発生しています。

今回確認されたz0260728についても、VB6とVB.NETでの挙動差異が疑われています。

VB6からVB.NETへの移行時に、IsDateによる日付判定について互換性上の注意点や既知の仕様差異があれば、併せてご教示ください。

開発者テクノロジ | .NET | その他
開発者テクノロジ | .NET | その他

.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。 特定のカテゴリに適合しないその他のトピック。

0 件のコメント コメントはありません

2 件の回答

並べ替え方法: 最も役に立つ
  1. motosan 3,395 評価のポイント
    2026-08-10T03:54:37.09+00:00

    私の環境では False になります。

    Visual Studio 2026 18.8.2

    下記のコードです。

    Imports System
    
    Module Program
        Sub Main(args As String())
            Console.WriteLine("Hello World!")
            If IsDate("z0260728") Then
                Console.WriteLine("True")
            Else
                Console.WriteLine("False")
            End If
        End Sub
    End Module
    
    

    結果

    Hello World! False

    時刻に Z を付加すると UTC 時刻になるようですが、Shiraishi さんとは環境が違うのでしょうか?

    正規表現で数値と桁数及び元号のチェックした後 IsDate 関数で日付のチェックすることもできると思いますが、どうでしょうか?

    追記)2026/8/10 20:53

    わかりにくくなったので、新しく回答に記述しました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。

  2. motosan 3,395 評価のポイント
    2026-08-10T12:22:04.0966667+00:00

    前の回答で追記に記述した 内容です。(わかりにくくなったので新しい回答としました)

    z を先頭に記述すると UTC 時刻 になるようです。

    .Net の日付文字列については下記に説明があります。

    DateTime.Parse メソッド (System) - 解析する文字列| Microsoft Learn.

    • 但し、先頭にzがあるケースについては記述がありません。
    • 年号は M:明治 T:大正 S:昭和 H:平成 R:令和なので、先頭にこの文字があってもIsDate関数は False になりません。
    • また、和暦は開始日のチェックはしていますが終了日のチェックはしていないようです。

    年号が代わった時のために IsDate でなく DateTime.TryParseExact で書式を指定してチェックした方が良いと思います。 追記)2026/8/12 21:02

    年号で M. T, ... を使用する場合は、TryParseExact が使用できないので DateTime.TryParse の利用を検討してください。

    但し、日本のカレンダーを使用した場合、和暦になります。

    (DateTime.TryParse では元号を省略すると現在の元号つまり令和として扱われます)

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません

お客様の回答

質問作成者は回答に "承認済み"、モデレーターは "おすすめ" とマークできます。これにより、ユーザーは作成者の問題が回答によって解決したことを把握できます。