2011-09-16 16 views
4

特定の日付と時刻の形式のAccess Dateオブジェクトに日付/時刻文字列を解析するにはどうすればよいですか?データと時刻の文字列を解析して日付にアクセスする値

私はこのようなCDate関数()関数を使用することができます。この作品

Dim StrDateTime As String 
    Dim DtTest As Date 

    StrDateTime = "2011-12-31 23:59:59" 

    DtTest = CDate(StrDateTime) 
    MsgBox DtTest 

を、アクセスが細かい、フォーマットを認識しますが、どのように私は絶対にこれは、すべての状況下で起こることを確認することができます(たとえば、日付/時刻設定地域の設定、アクセスバージョン?)。私はCDateに私の特別な日付/時刻形式を "伝えたい"と思います。

Dim StrDateTime As String 
    Dim IntYear As Integer 
    Dim IntMonth As Integer 
    Dim IntDay As Integer 
    Dim IntHour As Integer 
    Dim IntMinute As Integer 
    Dim IntSecond As Integer 

    StrDateTime = "2011-12-31 23:59:59" 

    IntYear = Val(Mid(StrDateTime, 1, 4)) 
    IntMonth = Val(Mid(StrDateTime, 6, 2)) 
    IntDay = Val(Mid(StrDateTime, 9, 2)) 
    IntHour = Val(Mid(StrDateTime, 12, 2)) 
    IntMinute = Val(Mid(StrDateTime, 15, 2)) 
    IntSecond = Val(Mid(StrDateTime, 18, 2)) 

    DtTest = DateSerial(IntYear, IntMonth, IntDay) 
    DtTest = DtTest + TimeSerial(IntHour, IntMinute, IntSecond) 
    MsgBox DtTest 

CDate関数のその他の利点():

その他のオプションは、この(しかし、多くのコード)であることは、間違った日付/時刻値の型の不一致エラーを与えます。 DateSerial + TimeSerialは新しい日付と時刻を再計算するので、 "2011-12-31 24:59:59"は01/Jan/2012 0:59:59になります。

+1

'CDate関数()'名誉地域設定にかかわらず、Accessのバージョンの。 'CDate()'の1つの欠点は、あいまいなテキスト値が地域の設定と一致しない場合に型の不一致が発生するとは限りません。私の設定は英国です、 'Month(CDate(" 28/04/2011 "))'は正しく4(4月)を返しますが、不合理なイギリスの値 'Month(CDate(" 04/28/2011 "))間違いなくエラーがより有用な場合は、4。 – onedaywhen

+0

"明確なフォーマット"の定義はなんですか?私の設定で私のコンピュータ上で認識されているという事実は、それが必ずしもあらゆる状況において意味するものではありませんか?または私は間違っていますか? 「yyyy-mm-dd hh:mm:ss」(およびその他の既知の形式)はすべてのシステムに共通ですか? – waanders

+0

これはどこかに記載されていますか?そして、 '' CDate( "yyyy-mm-dd hh:mm"、StrValue) 'のような、使用するパースフォーマットを明示的にCDate()に伝える方法はないのでしょうか? – waanders

答えて

7

フォーマット"YYYY-MM-DD"ISO standardれ、それに遭遇したとき、CDate()"YYYY"部分は"MM-DD" が続くことを期待、決してによって「DD- mm "。その形式の日付文字列は明白です。ユーザーのロケールに関係なく、同じ日付値を表します。そしてCDate()が準拠します。

さらに、CDate()「YYYY-DD-MM」としてフォーマットされた日付文字列を与えると、あなたが戻って予定の日付の値を取得する方法はありません。したがってCDate("2011-02-01")は、その文字列が#Jan 2 2011#を表すことを意図していたとしても、日付値#Feb 1 2011#(ロケールに関係なく)を常に提供します。 CDate("2011-31-01")は型の不一致エラーをスローします。

はまた、(Heinziさんのコメントを参照してください。)これが唯一の年100後の日付のために働くことに注意して

+0

ありがとう、優秀! – waanders

+1

これは、 '100年後の日付でのみ動作します:' CDate( "0001-02-03") 'は2003年2月1日をもたらすことに注意してください。 – Heinzi

関連する問題