Разобрать данные и строку времени в значение даты доступа - PullRequest
4 голосов
/ 16 сентября 2011

Как я могу разобрать строку даты / времени в объект Дата доступа, учитывая определенный формат даты и времени?

Я могу использовать функцию CDate () следующим образом:

  Dim StrDateTime As String
  Dim DtTest As Date

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

  DtTest = CDate(StrDateTime)
  MsgBox DtTest

Это работает, Access распознает формат, хорошо, но как я могу быть абсолютно уверен, что это происходит при любых обстоятельствах (например, настройки даты / времени, региональные настройки, версия Access?). Я хотел бы «сообщить» 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 Ответ

8 голосов
/ 26 сентября 2011

Формат "гггг-мм-дд" является стандартом ISO , и при его обнаружении CDate() ожидает, что часть "гггг" будет затем следует "мм-дд" , ни разу "дд-мм" . Таким образом, строка даты в этом формате однозначна; он представляет одно и то же значение даты независимо от локали пользователя. И CDate() будет соответствовать.

Кроме того, невозможно дать CDate() строку даты в формате "гггг-дд-мм" и получить значение даты, которое вы намереваетесь вернуть. Так что CDate("2011-02-01") всегда будет давать вам значение даты #Feb 1 2011# (независимо от вашей локали), даже если вы предполагали, что эта строка будет представлять #Jan 2 2011#. И CDate("2011-31-01") выдаст ошибку несоответствия типов.

Также обратите внимание, что это работает только для дат после 100 года. (См. Комментарий Хайнци.)

...