powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование строки в дату
11 сообщений из 11, страница 1 из 1
Преобразование строки в дату
    #35545974
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код:
Код: plaintext
1.
MsgBox "Sep 16 2008 18:40:07.135 = " + Trim(CDate("09 16 2008 18:40:07")) + Chr( 13 ) + "Sep 12 2008 12:24:26.676 = " + Trim(CDate("09 12 2008 12:24:26"))
Результатом преобразования Trim(CDate("09 12 2008 12:24:26"))
будет 9-е декабря. Есть ли в VB, VBA, VBS четкая установка формата даты?
P.S. Региональные настройки в ОС никак не влияют. Пробовал.
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35546207
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valex13Код:
Код: plaintext
1.
MsgBox "Sep 16 2008 18:40:07.135 = " + Trim(CDate("09 16 2008 18:40:07")) + Chr( 13 ) + "Sep 12 2008 12:24:26.676 = " + Trim(CDate("09 12 2008 12:24:26"))
Результатом преобразования Trim(CDate("09 12 2008 12:24:26"))
будет 9-е декабря. Есть ли в VB, VBA, VBS четкая установка формата даты?
P.S. Региональные настройки в ОС никак не влияют. Пробовал.

1. Нафига ты вначале строку пытаешься преобразовать в дату, если тебе и так нужна строка?

2.
Код: plaintext
Format$(Now, "dd mm yyyy hh:nn:ss")
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35546621
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно строка, чтобы понять как именно преобразовывает VB. Только для того, чтобы Вам показать...
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35546727
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valex13Мне нужно строка, чтобы понять как именно преобразовывает VB. Только для того, чтобы Вам показать...

Как сделать из дату строку в нужном формате я уже показал.
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35547904
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Я из строки в дата преобразовываю. Фокус в том, что 2 одинаковые по формату строки преобразовываются в разные даты. Запустите пример и Вам станет понятно.
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35548089
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку 16-е число не может быть месяцем, VB воспринимает его однозначно числом.
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35549155
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valex13Спасибо.
Я из строки в дата преобразовываю. Фокус в том, что 2 одинаковые по формату строки преобразовываются в разные даты. Запустите пример и Вам станет понятно.

Напиши так:

Код: plaintext
CDate(Mid$(s,  7 ,  4 ) & "-" & Left(s,  2 ) & "-" & Mid$(s,  4 ,  2 ) & " " & Mid$(s,  12 ,  8 ))
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35549291
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Так не пойдет.
Пример строки №1
Sep 16 2008 18:40:07.135
Пример строки №2
Sep 1 2008 18:40:07.135
т.е. если четко указывать подстроки и из них складывать строковое представление, то можно не попасть в формат. И дело даже не в том, что любой ценой преобразовать из строки в дату, а дело в том, почему так?
Я пробовал региональные настройки перенастраивать - бесполезно.
В T-SQL есть комманда, которая задает формат строки
Код: plaintext
1.
SET DATEFORMAT DMY
Нету ли чего нибудь подобного в VBA?
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35549331
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все потому что "Sep 16 2008 18:40:07.135" это дата чисто в твоем представлении. VB не понимает ни "Sep", ни "Сент", ни пробелов в качестве разделителя разрядов даты. Если строка похожа на ##.##.#### ##:##:##, то такую строку он поймет и сконвертирует в соответствии с региональными настройками. То есть если в настройках dd.mm, то 01.02 будет певым февраля, даже если по-твоему это второе января.
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35550721
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valex13Нет. Так не пойдет

Ну напиши свою функцию, которая будет делать так как тебе нужно. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Public Sub Main()
    Debug.Print Format$(CDateEx("Sep 16 2008 18:40:07", "mdy"), "d.m.yyyy hh:nn:ss")
    Debug.Print Format$(CDateEx("17 9 2008 18:40:07", "dmy"), "d.m.yyyy hh:nn:ss")
    Debug.Print Format$(CDateEx("18-2008-Sep 18:40:07", "dym"), "d.m.yyyy hh:nn:ss")
    Debug.Print Format$(CDateEx("2008/sep/8 18:40:07", "ymd"), "d.m.yyyy hh:nn:ss")
End Sub
    
Public Function CDateEx(ss As String, Optional ByVal ymd As String = "ymd") As Date
    Dim i As Integer, st As String, sd As String, v As Variant, s As String, k As Integer, _
        m As Integer, d As Integer, y As Integer, j As Integer
    
    ymd = LCase$(ymd)
    i = InStrRev(ss, " ")
    If i Then
        st = Mid$(ss, i)
        ss = Trim$(Left$(ss, i -  1 ))
    End If
    
    ss = Replace(ss, "-", " ")
    ss = Replace(ss, "/", " ")
    ss = Replace(ss, ".", " ")
    
    v = Split(ss, " ")
    On Error GoTo Err_
    For i =  0  To UBound(v)
        s = v(i)
        If Len(s) Then
            k = k +  1 
            If k =  4  Then GoTo Err_
            Select Case Mid$(ymd, k,  1 )
                Case "d"
                    If IsNumeric(s) Then
                        d = CInt(s)
                        If d <  1  Or d >  31  Then GoTo Err_
                    End If
                Case "m"
                    If IsNumeric(s) Then
                        m = CInt(s)
                        If m <  1  Or m >  12  Then GoTo Err_
                    Else
                        s = LCase(Left$(s,  3 ))
                        For j =  1  To  34  Step  3 
                            If s = Mid$("janfebmaraprmayjunjulaugsepoctnovdec", j,  3 ) Then
                                m = (j +  2 ) /  3 : Exit For
                            End If
                        Next j
                    End If
                    If m =  0  Then GoTo Err_
                Case "y"
                    If IsNumeric(s) Then y = CInt(s)
            End Select
        End If
    Next i
    CDateEx = CDate(Format$(DateSerial(y, m, d), "yyyy-mm-dd") & " " & st)
    Exit Function

Err_:
    Err.Raise  513 , , "Строка с датой содержит ошибку"
End Function
...
Рейтинг: 0 / 0
Преобразование строки в дату
    #35550986
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Спасибо за ответы. функцию на подобии Вашей я уже написал, конечно Вы привели просто БЕСТ функцию. Мне было жалко времени на унификацию. Сделал просто - "как учили в автошколе". По типу If Mid(strSource, 1,3) = "Sep" Then .... Вашу функцию я возьму на вооружение в дальнейшем. Думая тема исчерпана.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование строки в дату
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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