Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование строки в дату / 11 сообщений из 11, страница 1 из 1
18.09.2008, 10:45
    #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
18.09.2008, 12:02
    #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
18.09.2008, 14:30
    #35546621
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в дату
Мне нужно строка, чтобы понять как именно преобразовывает VB. Только для того, чтобы Вам показать...
...
Рейтинг: 0 / 0
18.09.2008, 15:06
    #35546727
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в дату
valex13Мне нужно строка, чтобы понять как именно преобразовывает VB. Только для того, чтобы Вам показать...

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

Напиши так:

Код: plaintext
CDate(Mid$(s,  7 ,  4 ) & "-" & Left(s,  2 ) & "-" & Mid$(s,  4 ,  2 ) & " " & Mid$(s,  12 ,  8 ))
...
Рейтинг: 0 / 0
19.09.2008, 15:33
    #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
19.09.2008, 15:45
    #35549331
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в дату
Все потому что "Sep 16 2008 18:40:07.135" это дата чисто в твоем представлении. VB не понимает ни "Sep", ни "Сент", ни пробелов в качестве разделителя разрядов даты. Если строка похожа на ##.##.#### ##:##:##, то такую строку он поймет и сконвертирует в соответствии с региональными настройками. То есть если в настройках dd.mm, то 01.02 будет певым февраля, даже если по-твоему это второе января.
...
Рейтинг: 0 / 0
21.09.2008, 03:53
    #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
21.09.2008, 18:48
    #35550986
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в дату
Спасибо. Спасибо за ответы. функцию на подобии Вашей я уже написал, конечно Вы привели просто БЕСТ функцию. Мне было жалко времени на унификацию. Сделал просто - "как учили в автошколе". По типу If Mid(strSource, 1,3) = "Sep" Then .... Вашу функцию я возьму на вооружение в дальнейшем. Думая тема исчерпана.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование строки в дату / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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