2013-10-10 2 views
2

Как и в Convert month name into number, я хочу использовать DateValue для создания даты из строки даты. Тем не менее, строка, которая у меня есть, гарантируется в формате США, а компьютер, выполняющий код, работает на немецких локалях.Преобразование значения строки даты из U.S в исходную дату с текущей локалью <> U.S.?

Пример: DateValue не подходит для "10 Oct 2013 06:50:19", это будет успешным для "10 Okt 2013 06:50:19", так как «Октябрь» - «Октобер» на немецком языке.

I.e. Мне нужно получить дату из строки в формате даты для конкретной страны, который отличается от языкового стандарта currert.

Как я могу это сделать без жесткого кодирования таблицы перевода имен месяцев между английскими и немецкими?

Кроме того, код должен продолжать работать, если рабочая станция, выполняющая код, переконфигурирована для другой локали, поэтому я ищу способ временно изменить настройки, чтобы получить дату США через DateValue, а затем вернуться к оригинальный установка. Конечно, этот код должен быть в среде Windows-переносов ...

Код, который возникает при этой проблеме, показан ниже. Он пытается получить системное время конкретного сервера, заглядывая в заголовок http. Это не удается, если текущее (короткое) название месяца на английском языке отличается на немецком языке.

Public Function GetServerTimeFromUrl (ByVal Url,ByRef DT) 

    Dim HttpRequest: Set HttpRequest = CreateObject("Microsoft.XMLHttp") 
    HttpRequest.Open "GET" , Url, false 
    HttpRequest.Send 

    Dim Result: Result=(HttpRequest.Status = 200) 
    If Result then 

     Dim DateS: DateS=HttpRequest.getResponseHeader ("Date") 
     DateS=Right (DateS,Len (DateS)-InStr (DateS,",")-1) 
     ' DateS has weekday removed 

     DateS=Left (DateS,InStrRev (DateS," ")-1) 
     ' DateS has timezone removed 

     ' DateS now holds something like "09 Sep 2013 11:49:54" 
     Dim ServerTimeGMT: ServerTimeGMT=DateValue (DateS)+TimeValue (DateS) 

     Dim Delta: Delta=CreateObject("WScript.Shell").RegRead("HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")  
     ' Delta now holds "skew" value for time zone including DST 
     DT=DateAdd("n", -Delta,ServerTimeGMT) 
     Result=true 
    End If 
    GetServerTimeFromUrl=Result 
End Function 

ответ

2

Вы можете использовать GetLocale и SetLocale изменить региональные настройки:

Это должно работать на немецкой системе с датой США

option explicit 

dim currentLocale 
currentLocale = GetLocale() 

SetLocale 1033  ' 1033 is the EN-US locale 
msgbox datevalue("9 Oct 2013 06:50:19") 
' Output: 10/9/2013 

' Put back the original locale 
SetLocale currentLocale 

Или наоборот; немецкая дата в американской системе

SetLocale 1031  ' 1031 is the German locale 
msgbox datevalue("9 Okt 2013 06:50:19") 
' Output: 09.10.2013 
+0

О, конечно! Это так просто. Спасибо. – TheBlastOne

+0

Просто [зная, какой винт поворачивать] (http://calvinconaway.com/2007/05/27/knowing-which-screw-to-turn/), и именно поэтому сайты, такие как SO, настолько велики! – AutomatedChaos

Смежные вопросы