Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как узнать системный формат даты? Добавлено: 16.04.10 00:43  

Автор вопроса:  Champion | Web-сайт: afhelp.in.ua | ICQ: 461506481 
есть большие логи на 20-100 тысяч строк
на разных виндах дата в них записана по разному
пример:
4/13/2010 19:55:36
01.4.2010 г. 14:06:59
02.03.2010 21:09:06

обрабатывать каждую строку получается очень долго

вопрос собсно в теме или может как-то по другому парсить текст, чтобы засунуть его в переменую типа Date?

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #1
Добавлено: 16.04.10 01:15
Если убрать "г. ", то любой из трех форматов можно запросто засунуть в Date
Номер ответа: 2
Автор ответа:
 Champion



ICQ: 461506481 

Вопросов: 38
Ответов: 88
 Web-сайт: afhelp.in.ua
 Профиль | | #2
Добавлено: 16.04.10 03:00
"г. " это единственное обозначение даты в Болгарии, в остальных странах буков нету в короткой дате, кроме "/" "-" "."
а насчет засунуть, немного пример не правильно привел
в оригинале в тексте оно вот так "[04.04.2010|11:35:41]" или так "[01.4.2010 г. |14:06:59]"
т.е. разбирать на запчасти в любом случае пришлось

погуглил, ничего хорошего не нашел
потом пересмотрел все форматы всех стран)), в итоге тупо написал функцию, которая работает для всего)
немного топорно, но свое дело делает

  1.  
  2. Public Function StoreLog_GetDate(data As Variant) As Date
  3. On Error Resume Next
  4. Dim t1$, t2$, t3$, splD As Variant
  5.   t1 = data
  6.   splD = Split(t1, "|", , vbTextCompare)
  7.   If UBound(splD) <> 1 Then Exit Function
  8.   t3 = Left$(splD(1), Len(splD(1)) - 1)
  9.   t2 = splD(0)
  10.  
  11.   Do
  12.     If Len(t2) = 0 Then Exit Function
  13.     If Asc(t2) < 48 Or Asc(t2) > 57 Then t2 = Mid$(t2, 2)
  14.   Loop While (Asc(t2) < 48 Or Asc(t2) > 57)
  15.   t2 = StrReverse(t2)
  16.   Do
  17.     If Len(t2) = 0 Then Exit Function
  18.     If Asc(t2) < 48 Or Asc(t2) > 57 Then t2 = Mid$(t2, 2)
  19.   Loop While (Asc(t2) < 48 Or Asc(t2) > 57)
  20.   t2 = StrReverse(t2)
  21.  
  22.   If IsDate(t2) Then StoreLog_GetDate = CDate(t2 & " " & t3)
  23. End Function



насчет скорости, 100000 обработок за 1,640625 сек выполняет
Номер ответа: 3
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #3
Добавлено: 16.04.10 08:05
Боже...
Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 16.04.10 08:05
  1. Function StoreLog_GetDate(strDate As String) As Date
  2.     strDate = Mid$(strDate, 2, Len(strDate) - 2)
  3.     strDate = Replace$(strDate, "|", " ")
  4.     strDate = Replace$(strDate, "г.", "")
  5.     StoreLog_GetDate = CDate(strDate)
  6. End Function
Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 16.04.10 11:13
а я бы через регулярку сделал...
Номер ответа: 6
Автор ответа:
 Champion



ICQ: 461506481 

Вопросов: 38
Ответов: 88
 Web-сайт: afhelp.in.ua
 Профиль | | #6
Добавлено: 16.04.10 15:53
Executioner
да, коротко и ясно, спасибо за трезвый взгляд), мне нужно было просто поспать ... а в примере, просто хотел предотвратить разные разности

ошибки удалось устранить, осталась одна, но уже при обновлении лога в программе
для фильтров по дате использую такой вариант
  1.  
  2.         ' LogData.LogPeriod - кол-во дней
  3.         lastdate = CDate(FormatDateTime(DateAdd("d", -LogData.LogPeriod, Now), vbShortDate) & " 00:00:01")
  4.         nowdate = CDate(FormatDateTime(Now, vbShortDate) & " 23:59:59")


и потом сравниваю
  1.  
  2.        if .fDate > lastdate And .fDate < nowdate Then tC = tC + 1


в этом возможна ошибка?
Номер ответа: 7
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #7
Добавлено: 16.04.10 16:38
Есть одна славная функция... Думаю, поможет.

Function DateDiff(Interval As String, Date1, Date2, [FirstDayOfWeek As VbDayOfWeek = vbSunday], [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1])
    Member of VBA.DateTime
    Returns the number of time intervals between two specified dates
Номер ответа: 8
Автор ответа:
 Champion



ICQ: 461506481 

Вопросов: 38
Ответов: 88
 Web-сайт: afhelp.in.ua
 Профиль | | #8
Добавлено: 16.04.10 16:52
я понимаю, но как с её помощью установить время для любой даты в "00:00:01" и в "23:59:59" - начало и конец суток

в фильтрах отображения лога есть опции: за сегодня, вчера, позавчера; за три дня, неделю, месяц
последний пример, что приводил это для "сегодня, вчера, позавчера"

а за "три дня, неделю, месяц"
  1.  
  2.           'LogData.LogPeriod принимает значение 3,7,30
  3.           lastdate = CDate(FormatDateTime(DateAdd("d", -LogData.LogPeriod, Now), vbShortDate) & " 00:00:01")
  4.           nowdate = CDate(FormatDateTime(DateAdd("d", -LogData.LogPeriod, Now), vbShortDate) & " 23:59:59")

Номер ответа: 9
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #9
Добавлено: 16.04.10 17:59
Просто сравнивать только дату, без времени. ИМХО. Зачем время - не пойму.
Номер ответа: 10
Автор ответа:
 Champion



ICQ: 461506481 

Вопросов: 38
Ответов: 88
 Web-сайт: afhelp.in.ua
 Профиль | | #10
Добавлено: 16.04.10 20:26
потому что в фильтрах время ещё есть)

спасибо за помощь, тему можно закрыть

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам