0

だから私は、データ型がデータベースにフィードされるテキストであるというフィールドを持っています。返されるのは、次のようなものです。

ddd MMM dd hh:mm:ss yyyy

私がやりたいことは、次のように表示されることです:

ddd MMM dd yyyy hh:mm:ss

これは、次のような Format() を使用して実現できます。

Format(alarmdet.AlarmStart, "ddd MMM dd yyyy hh:mm:ss) AS AlarmDateTime

ただし、それで問題ありません。この値を日時に変換できるようにしたいです。CVDate、CDate、DateValue を使用してみましたが、データ型が一致しないというエラーが返されるたびに返されます。この正確な文字列を日時に変換するにはどうすればよいですか?

ノート:

ご存じのとおり、英語 (米国) ロケールでは正常に変換できますが、ポルトガル語 (ポルトガル) ロケールではこれを機能させようとしています。このロケールでは、アクセスが省略された月を読み取る方法に関係があると思われるデータ型の不一致エラーが発生します。これを国際的な環境でうまく機能させるために欠けているものはありますか?

また、別のフィールドでこれに似たものを変換して、次のように表示したいと思います。

MM/dd/yyyy

繰り返しますが、Format() を使用してこれを取得できることはわかっていますが、DateTime に変換したいと考えています。どうすればこれを行うことができますか?

どんな助けや提案も大歓迎です。

ありがとう。

4

3 に答える 3

2

最初の課題は、カスタム文字列を有効な日付として読み取ることです。前の質問では、[AlarmStart] フィールドに保存されているサンプル文字列としてこれを指定しました。

Tue Jan 18 10:10:57 2011

問題は、VBA がその文字列を有効な日付/時刻値を含むものとして認識しないことです。

? IsDate("Tue Jan 18 10:10:57 2011")
False

ただし、その文字列を修正すると (曜日を削除し、時刻の前に年を移動する)、VBA が有効な日付として認識する文字列を生成できます。

? IsDate("Jan 18 2011 10:10:57")
True

したがって、関数を使用して文字列を分割し、必要な部分を再配置して、日付/時刻値を返すことができます。

Public Function DateFromCustomString(ByVal pIn As String) As Variant
    Dim varPieces As Variant
    Dim strNew As String
    Dim varReturn As Variant

    varPieces = Split(pIn)
    strNew = Join(Array(varPieces(1), varPieces(2), varPieces(4), _
        varPieces(3)), " ")
    If IsDate(strNew) Then
        varReturn = CDate(strNew)
    Else
        varReturn = Null
    End If
    DateFromCustomString = varReturn
End Function

(Split() および Join() 関数は、Access 2000 以降で使用できます。)

また、文字列から日付/時刻の値を取得したら、Format() 関数を使用して好きなように表示できます。

Format(DateFromCustomString(alarmdet.AlarmStart), "ddd MMM dd yyyy hh:mm:ss") AS AlarmDateTime
Format(DateFromCustomString(alarmdet.AlarmStart), "mm/dd/yyyy") AS AlarmDate

これは、英語の月名の略語で説明されているように機能します。ポルトガル語はどうなるかわかりません。

于 2011-08-31T22:32:35.803 に答える
0

ロケールに関係なく、辞書オブジェクトを使用して、英語の月の省略形を数字に変換できます。以下の関数は、上記の形式を有効な日付/時刻に変換します。おそらく、より優れたエラー ハンドラを作成する必要があるでしょう。

Public Function textToDate(text As String) As Date
    Dim months As Object
    Dim year As String
    Dim month As String
    Dim day As String
    Dim time As Date

    On Error GoTo eh

    text = Trim(text)

    Set months = CreateObject("Scripting.Dictionary")
    months.Add "Jan", 1
    months.Add "Feb", 2
    months.Add "Mar", 3
    months.Add "Apr", 4
    months.Add "May", 5
    months.Add "Jun", 6
    months.Add "Jul", 7
    months.Add "Aug", 8
    months.Add "Sep", 9
    months.Add "Oct", 10
    months.Add "Nov", 11
    months.Add "Dec", 12

    year = Right(text, 4)
    month = months(Mid(text, 5, 3))
    day = Mid(text, 9, 2)
    time = CDate(Mid(text, 12, 8))

    textToDate = CDate(DateSerial(year, month, day) + time)
Exit Function
eh:
    textToDate = #1/1/1900#
End Function

編集: このソリューションを使用することになった場合は、私の mid(); ではなく HansUp の Split() メソッドを使用してください。はるかにクリーンで安全です。

于 2011-08-31T22:06:51.933 に答える
-1

使用する

Strings.FormatDateTime("2011-09-01",vbGeneralDate) 
于 2011-09-01T17:50:48.750 に答える