より良いCDateのためのVB6
質問
して、VB6ースのアプリケーション(内のCOMコンポーネントを利用しCDate()を文字列とキャストが日付、保存の改善に取り組んでいます。●
よしたい場合は、あらかの話 dd/MM/yy または MM/dd/yy 例えば、変更しておりますの地域設定のアイデンティティのユーザーのCOM願います。(現在にい 厄hack.)
した日付フォーマット文字列に使用されるフォーマットのすべての出力には、ることが想定される日
このた.純て使用 DateTime.ParseExact および使用することもあるらしく笑っている。呼び出しになCOMオブジェクト書きます。純この目的は、オプションとなっています。はありませるためには、より良いオプション、黒魔法の形式のコマンドは、再利用可能な機能tokenizesの日によってはフォーマット文字列などが有ります。
解決
これは、近くにある必要があります:
Private Function ParseDate(ByVal DateString As String, _
ByVal DatePattern As String) As Date
'DateString: i/j/k formatting.
'DatePattern: i/j/k formatting, each to be:
' M or MM for month position.
' D or DD for day position.
' YY or YYYY for year position, if YY
' then century windowed at 50.
Dim strStringParts() As String
Dim strPatternParts() As String
Dim intPart As Integer, intScore As Integer
Dim intMonth As Integer, intDay As Integer, intYear As Integer
Const DELIM As String = "/"
Const YYWINDOW As Integer = 50
strStringParts = Split(DateString, DELIM)
strPatternParts = Split(UCase$(DatePattern), DELIM)
For intPart = 0 To UBound(strStringParts)
If intPart > UBound(strPatternParts) Then
Err.Raise 5, "ParseDate"
End If
Select Case strPatternParts(intPart)
Case "M", "MM"
intMonth = CInt(strStringParts(intPart))
intScore = intScore Or &H1
Case "D", "DD"
intDay = CInt(strStringParts(intPart))
intScore = intScore Or &H2
Case "YY"
intYear = CInt(strStringParts(intPart))
If 0 > intYear Or intYear > 99 Then
Err.Raise 5, "ParseDate"
End If
intYear = intYear + IIf(intYear < YYWINDOW, 2000, 1900)
intScore = intScore Or &H4
Case "YYYY"
intYear = CInt(strStringParts(intPart))
If 100 > intYear Or intYear > 9999 Then
Err.Raise 5, "ParseDate"
End If
intScore = intScore Or &H4
Case Else
Err.Raise 5, "ParseDate"
End Select
Next
If intScore = &H7 Then
ParseDate = DateSerial(intYear, intMonth, intDay)
Else
Err.Raise 5, "ParseDate"
End If
End Function
の検証は完璧ではないかもしれないが、それは近くにあるべき。それは悪い入力の上、「無効なプロシージャ呼び出しまたは引数(エラー5)」をスローします。
他のヒント
見て、簡単に言うことだ螺.合わせフリーフォームから入力したweb、共に暮らしている現状では世界中の人々の形式の日とは異なります。そのた 多くの ウェブサイトにポップアップカレンダーなどの、ユーザー入力します。いまいにならない。なお返事ありがとうございます。,.当期純に上書きできなぜ自分のユーザの意図り、他の図書館があります。
Fwiw、コードはマイクを掲載しは絶対にVB6.お使いいただくことによっていうVB.NET?ロサンゼルス生まれの日付/時刻日付変数を表示することができたしたいと形式().それが簡単です。
いることが強く示唆する)からの入力が明確にして、ユーザーに伝えはどのような形式まで、生うに入力します。すべてとは可能でした誤解され、問題とならないかもしれませんどの形式のユーザーに資するデータを提供す。(その場合、もとでお困りの理解などの問題は解釈でClassicVB-。)
DateAdd
は、正しい形式で入力と出力の多種多様を受け付ける。
ThisLine = "Tuesday, September 04, 2012 2:02 PM"
i = InStr(ThisLine, ",") ' get rid of the leading day
If i > 0 Then
TempResult = Trim(Right$(ThisLine, Len(ThisLine) - i))
end if
TempResult = DateAdd("s", 0, TempResult)
あなたがウェブからの入力を取っている他の回答の一つにコメントで言及します。
その場合は、
そして、それはあなたのロケール設定があるかは重要ではありません、あなたは、ユーザーが意図した日付を取得します。
あなたはあなたのためにこれを行うには、組み込みのFormat
機能を使用することができます。
ここでこれを確認するための簡単なテストがあります:
Public Sub TestDateParsing()
'On my computer, the date format is U.S. (mm/dd/yyyy)'
'This test creates a date string in dd/mm/yyyy format to'
'simulate user input in a different format'
Const TEST_DATE As Date = #6/1/2009#
Dim inputDate As String
inputDate = Format(TEST_DATE, "dd/mm/yyyy")
'inputDate is "1/6/2009" (June 1 in dd/mm/yyyy format)'
Debug.Print Format(inputDate, "dd/mm/yyyy")
'It`s magic! The above line will print 6/1/2009'
'which is the correct format for my Regional Settings'
End Sub
これは魔法のように思えるかもしれないが、そうではありません。それはFormat
機能は、現在の地域設定と連動して動作方法を活用しています。
たとえば、あなたの地域設定は、日付の"mm/dd/yyyy"
形式を使用するように設定されていると仮定します。
さて、あなたは"dd/mm/yyyy"
形式でユーザーからの日付文字列を取得します。あなたは、この日付の文字列をFormat
ともFormat
を使用するように"dd/mm/yyy"
を伝える場合は、あなたの設定は日付が"mm/dd/yyyy"
形式であると言うので、それは日付の月と日の部品を交換します。
言い換えれば、Format
は常にあなたが"mm/dd/yyyy"
を使用して日付をフォーマットするためにそれを伝えるときに、それを交換するためにそれを強制的に、ユーザーからの日付文字列が(この場合は、"dd/mm/yyyy"
)あなたの現在の地域設定に従って書式設定されていると仮定します月と日の部分。あなたの地域設定は、ユーザー提供の日付と同じ形式を使用している場合、このコードは動作します:Format
は、単にそのままユーザーの日付を返します。まだ混乱? ;)
あなたの地域設定が"dd/mm/yyyy"
に設定されている場合は、同じことが起こると、ユーザが"mm/dd/yyyy"
形式で日付を送信します。
キャッチはあなたが先にユーザーが日付を送信しているフォーマットの時間の知っている必要があることである。彼らは、日付形式を混合し、マッチングを開始することはできません(と彼らはとにかくすべきではない)。
<時間>EDIT(のMarkJによっての) - ちょうどマイクのコードは、文字列を日付に変換できることを証明します。マイクは、ロールバックまたはしたい場合は、この編集を変更してください。
Public Sub Test()
Dim dte As Date
For dte = #1/1/2009# To #12/31/2009#
Call TestDateParsing(dte)
Next dte
End Sub
Public Sub TestDateParsing(ByVal dteIn As Date)
'On my computer, the date format is U.S. (mm/dd/yyyy)'
'This test creates a date string in dd/mm/yyyy format to'
'simulate user input in a different format'
Dim sExpected As String
sExpected = Day(dteIn) & " / " & Month(dteIn) & " / " & Year(dteIn)
Dim inputDate As String
Dim dte As Date
inputDate = Format(dteIn, "dd/mm/yyyy")
dte = Format(inputDate, "dd/mm/yyyy")
Debug.Assert sExpected = Day(dte) & " / " & Month(dte) & " / " & Year(dte)
Debug.Print sExpected
End Sub
私は簡単な解決策を知りません。あなたはスプリットはサブに入力文字列をの可能性区切り文字によって、文字列、および DateSerialのに使用ネイティブVB6の変数の日。以下、このような何か。あなたはロケールの多くをサポートする必要がある場合、これは複雑になる可能性があり(ボブの答えをご覧くださいを)。断っておくが、そうDateTime.ParseExactを使用します。
sInput = "1/3/71"
Dim splt() As String
splt = Split(sInput, "/")
dte = DateSerial(splt(2) + 1900, splt(1), splt(0)) ' dd/mm/yy'
別の方法:
Public Enum abDateType
abMDY
abDMY
End Enum
Public Function MakeDate(ByVal dateString As String, ByVal dateType As abDateType, Optional delimiter As String = "/") As Date
Dim strVals() As String
Dim dtRtnVal As Date
strVals = Split(dateString, delimiter)
Select Case dateType
Case abMDY
dtRtnVal = DateSerial(strVals(2), strVals(0), strVals(1))
Case abDMY
dtRtnVal = DateSerial(strVals(2), strVals(1), strVals(0))
Case Else
Err.Raise vbObjectError, , "Unexpected date format."
End Select
MakeDate = dtRtnVal
End Function
あなたは日付変数(ないフォーマットされた文字列)と話をして、ユーザーの地域設定を使用してフォームでフォーマットされた値を表示したり、日付変数にユーザからの入力を取る必要があります。