powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поговорим о датах
13 сообщений из 13, страница 1 из 1
Поговорим о датах
    #37110269
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. тут недавно был предложен следующий корректный, так сказать, универсальный с т.зр. национальных предрассудков формат "запихивания" в БД Access, а именно:
Код: plaintext
# 02 / 10 / 2011   22 : 46 : 28 #
Что касается БД, я согласился.
Но у меня в проге помимо БД-представления существует txt-представление, и хоть я и принял "модель БД" для хранения "много строчек", но по историческим причинам во многих местах проги использую txt-формат (при работе с конкретной "строчкой").

Т.е. напр. БД-представление:
Код: plaintext
[DateTime1]=# 02 / 10 / 2011   22 : 46 : 28 # (asДата)  [DateTime2]=# 02 / 10 / 2011   22 : 49 : 02 #(asДата) (условно естественно) ...
а txt представление (как у меня сейчас есть) ,будет
Код: plaintext
Date1= 10 . 02 . 2011 ;Time1= 22 : 46 : 28 ;Date1= 10 . 02 . 2011 ;Time1= 22 : 49 : 02 ;........
Соответственно все mm dd yyyy hh mm ss берутся от туда тупо "анализом структуры текста".

Сейчас в связи с модернизацией (ну раз БД впихнул, стало быть "гулять так гулять")
надо добавить в БД в таблицу еще 3 поля вышеуказанного класса "Дата-время".

Дебильное txt-представление Date1=..;Time1= что-то не нравится уже, да и обработка накладная...

Разумно ли в качестве txt-представления использовать:
Код: plaintext
[DateTime1=# 02 / 10 / 2011   22 : 46 : 28 #;DateTime2=# 02 / 10 / 2011   22 : 49 : 02 #;........]
вместо того как привел выше.
Т.е.
Код: plaintext
1.
2.
3.
всегда ли (на произв. национальной системе) смогу я сделать напр.
Time=Format ("#02/10/2011 22:46:28#", "hh:mm")
или скажем для отображения в нац. формате
TextDate.text =cstr(# 02 / 10 / 2011   22 : 46 : 28 #)

....Тэкс..попробовал чего написал...ерунда получается
потому что вытащив из длинной строки DateTime я получу
"#02/10/2011 22:46:28#" (String)
а не
#02/10/2011 22:46:28# (ДатаВремя)
А мне нужен String но скажем в нац. формате.

Т.е. cstr(#02/10/2011 22:46:28#)-->> "10.02.2011 22:46:28" (нац. формат) -это понятно

А как тогда?

"#02/10/2011 22:46:28#" (Str)-->> "10.02.2011 22:46:28" (нац. формат Str)
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110392
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы было наверняка, нац. формат нужно вытащить из региональных настроек с помощью апи, которой я не помню, и подставить в Format.
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110398
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дас, проблема...
Вот энтот тестовый кусок кода ее показывает:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Command1_Click()
    Dim dt_str As String
    Dim DT As Date
    dt_str = "#2/10/2011 22:46:28#"
    DT = dt_str 'Type mismatch !!! DT=cDate(dt_str)-то же самое
    MsgBox DT
End Sub

Я могу конечно писать как dt_str = "2/10/2011 22:46:28",
но тогда на russian computers будет 2 октября а не 10 февраля, как положено.
Т.е. без "собственного конвертера" все равно не обойдусь.
Посему можно и не менять ничего и делить время и дату на 2 "txt-поля" как и делал...даб не изобретать новой такой же ерунды..

Или тупо писать String в нац.формате CStr(the_asDate), но эт еще большая ерунда, собственное кодирование в каком-то одном формате хотя бы надежно.
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110399
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я не ошибаюсь, должно работать DT = #2/10/2011 22:46:28# без всяких кавычек.
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110404
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЧтобы было наверняка, нац. формат нужно вытащить из региональных настроек с помощью апи, которой я не помню, и подставить в Format.
Да не, всю "кухню" надо оставлять как есть.
В БД я пишу, как рекомендовали:
Код: plaintext
1.
2.
3.
4.
5.
Public Function GetMyAccessDateTime(regionalDateTime As String) As String
    GetMyAccessDateTime = ""
    If IsDate(regionalDateTime) Then
        GetMyAccessDateTime = "#" & Format$(regionalDateTime, "mm\/dd\/yyyy hh:mm:ss") & "#"
    End If
End Function

Из БД его достаем как Date.
Ну а уж в String
dateN1=mm.dd.yyyy;timeN1=hh:mm:ss;dateN2=mm.dd.yyyy;timeN2=hh:mm:ss;...

Ну обратно соотв. serial date/time =>GetMyAccessDateTime
по крайней мере это не сглючит...

AntonariyЕсли я не ошибаюсь, должно работать DT = #2/10/2011 22:46:28# без всяких кавычек.
Естественно, но я бухаю всю запись из БД в одну строчку типа:
field1=value1;field2=value2;field3=value3;...
и при доставании из этой строки "без кавычек" никак не будет.
Чтобы так не делать, надо оч. много везде поменять, что нерентабельно думаю
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110433
Дмитрий77,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub Command1_Click()
    Dim dt_str As String
    Dim DT As Date
    'dt_str = "#2/10/2011 22:46:28#"
    dt_str = "2/10/2011 22:46:28"

' допустимые разделители компонентов даты: слеш,точка,тире
' допустимые разделители компонентов времени: только двоеточие
' т.е. можно так 
' dt_str = "2.10.2011 22:46:28"
' и так
' dt_str = "2-10-2011 22:46:28"
' и вот так
' dt_str = "2-10.2011 22:46:28"

    dt_str = Format(dt_str, "mm/dd/yyyy hh:mm:ss")

    DT = CDate(dt_str)
    MsgBox Format(DT, "Long Date") & " " & Format(DT, "Short Time")
End Sub
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110434
упс... поторопился. Неправильно работает.
при dt_str = "22/10/2011 22:46:28"
выдает
22 октября ...

Сорри.
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110440
Нормально отрабатывает с представленим входной строки в формате "yyyy/mm/dd hh:mm:ss".
И функция Format оказалась излишеством.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Sub DT_FromTEXT()
    Dim dt_str$
    Dim DT As Date
    
    On Error GoTo Err_date
    
    dt_str = "2011-2/10 22:46:28"
    DT = CDate(dt_str)
    MsgBox Format(DT, "Long Date") & " " & Format(DT, "Short Time") & vbCrLf & DT
    
    dt_str = "2011-22/10 22:46:28"
    DT = CDate(dt_str)
    MsgBox Format(DT, "Long Date") & " " & Format(DT, "Short Time") & vbCrLf & DT
    
Exit_sub:
    Exit Sub
Err_date:
    MsgBox "incorrect date: '" & dt_str & "'"
    Resume Next
End Sub
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110454
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придется, наверное, парсить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Test()
  Dim txt$, a, dt As Date
  txt = "#2/10/2011 22:46:28#"
  a = Split(Replace(Mid$(txt,  2 , Len(txt) -  2 ), "/", " "))
  dt = DateSerial(a( 2 ), a( 0 ), a( 1 )) + CDate(a( 3 ))
  MsgBox txt & vbLf _
         & "dt=" & dt & vbLf _
         & "y=" & Year(dt) & vbLf _
         & "m=" & Month(dt) & vbLf _
         & "d=" & Day(dt)
End Sub
...
Рейтинг: 0 / 0
Поговорим о датах
    #37110623
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, если хранить дату в строке, то я бы хранил ее в виде строки из 14 цифровых символов.
Код: plaintext
1.
2.
3.
4.
Function DateToStr(ByVal dt As Date) As String
DateToStr = Format(Year(dt), "0000") & Format(Month(dt), "00") & Format(Day(dt), "00") _
& Format(Hour(dt), "00") & Format(Minute(dt), "00") & Format(Second(dt), "00")
End Function
Код: plaintext
1.
2.
3.
4.
Function StrToDate(ByVal sdt As String) As Date
StrToDate = DateSerial(CInt(Mid(sdt,  1 ,  4 )), CInt(Mid(sdt,  5 ,  2 )), CInt(Mid(sdt,  7 ,  2 ))) + _
TimeSerial(CInt(Mid(sdt,  9 ,  2 )), CInt(Mid(sdt,  11 ,  2 )), CInt(Mid(sdt,  13 ,  2 )))
End Function
пример
Код: plaintext
1.
2.
3.
4.
5.
Dim sdate As String, ddate As Date
ddate = # 2 / 10 / 2011   5 : 45 : 10  PM#
sdate = "20110210174510"
MsgBox DateToStr(ddate)
MsgBox StrToDate(sdate)
...
Рейтинг: 0 / 0
Поговорим о датах
    #37111560
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIПридется, наверное, парсить:...
Ну, похоже к этому все и сводится
Код: plaintext
Date1= 10 . 02 . 2011 ;Time1= 22 : 46 : 28 ;
Т.е. именно "парсить" у меня и реализовано. Любой из предложенных вариантов, суть модификация моего.
Придумывать yyyy-dd/mm , не охота, споткнется где-нибудь случайно, слишком заумно.
Идея была в том чтоб универсально вписать дату/время в строчку, чтоб максимально просто работать с "универсальным", но при этом текстовым представлением.

Т.е. при доставании из БД я пишу в "свой формат".
При пихании в БД я именно парсю этот формат, использую SerialDate/Time
и национальную строчку конвертирую в Access формат (хотя нац. формата SerialDate & " " SerialTime уже считаю достаточно, ну да бог с ним спорили уже).
Т.е. по сути это равносильно предложенному...
Шило на мыло при уже имеющихся проверенных функциях думаю менять смысла нет.
...
Рейтинг: 0 / 0
Поговорим о датах
    #37112337
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть возможность, то даты лучше хранить как числа (As Double), тогда конвертация заключается только в изменении типа с помощью CDate(DoubleValue).
Если по каким-то причинам нужно даты хранить как текст, но так как даты - это те же числа As Double, то можно тупо хранить эти числа в текстовом формате. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function ToStr(dt As Variant) As String
  ToStr = Trim$(Str(CDbl(dt)))
End Function

Function ToDate(TxtOrNum As Variant) As Date
  ToDate = CDate(Val(TxtOrNum))
End Function

Sub Test()
  Dim dbl As Double, dt As Date
  dbl = # 2 / 10 / 2011   10 : 46 : 28  PM#   ' =40584.9489351852
  dt = # 2 / 10 / 2011   10 : 46 : 28  PM#
  MsgBox ToDate(ToStr(dbl)) & vbLf _
       & ToDate(ToStr(dt))
End Sub

Если уже есть что-то, пусть кривое, но работает, то обычно его лучше не трогать :-)
...
Рейтинг: 0 / 0
Поговорим о датах
    #37112429
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подправил ToDate и для чисел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Function ToStr(dt As Variant) As String
  ToStr = Trim$(Str(CDbl(dt)))
End Function

Function ToDate(TxtOrNum As Variant) As Date
  If VarType(TxtOrNum) = vbString Then
    ToDate = CDate(Val(TxtOrNum))
  Else
    ToDate = CDate(TxtOrNum)
  End If
End Function

Sub Test()
  Dim dbl As Double, dt As Date
  dbl = # 2 / 10 / 2011   10 : 46 : 28  PM#   ' =40584.9489351852
  dt = # 2 / 10 / 2011   10 : 46 : 28  PM#
  MsgBox ToDate(ToStr(dbl)) & vbLf _
       & ToDate(ToStr(dt)) & vbLf _
       & ToDate(dbl) & vbLf _
       & ToDate(dt)
End Sub
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поговорим о датах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]