2013-11-14 2 views
1

У меня есть VBScript, который записывает dateTimne в файл.Неверный формат даты и времени VBS

Option Explicit 
Dim fso, path, file, recentDate, recentFile, objFileHandle 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set recentFile = Nothing 
For Each file in fso.GetFolder("\\path\folder").Files 
    If (recentFile is Nothing) Then 
    Set recentFile = file 
    ElseIf (file.DateLastModified < recentFile.DateLastModified) Then 
    Set recentFile = file 
    End If 
Next 

Set objFileHandle = fso.OpenTextFile("\\path\folder\DateTime.Txt", 2, "True") 
objFileHandle.Write(FormatDateTime(recentFile.DateLastModified)) 
objFileHandle.Close 

Когда я запустить его вручную на моем сервере это дает мне формат США в мм/дд/гггг чч: мм: сс AM, например 11/14/2013 9:20:56 AM.

Когда я запускаю его на своем ноутбуке, он возвращает мне формат Великобритании, который я действительно хочу - dd/mm/yyyy hh: mm: ss AM, например, 14/11/2013 9:20:56 AM.

Любые идеи, что происходит здесь?

+1

Обратите внимание, что '' True ''является только« True »случайно (потому что любая непустая строка, которая оценивает значение« True »-« False », будет работать так же хорошо). Используйте фактическое значение Boolean, а не строку. – Tomalak

ответ

2

Попробуйте:

Option Explicit 
Dim fso, path, file, recentDate, recentFile, objFileHandle 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set recentFile = Nothing 
For Each file in fso.GetFolder("folder").Files 
    If (recentFile is Nothing) Then 
     Set recentFile = file 
    ElseIf (file.DateLastModified < recentFile.DateLastModified) Then 
     Set recentFile = file 
    End If 
Next 

' YYYY-MM-DD HH:MM:SS (24h ISO 8601 Format) 
' You can permutate parameters and delemiters the way you want. 

Dim thisday , thistime 
thisday = Date 
thistime = Time 

Set objFileHandle = fso.OpenTextFile("folder\DateTime.Txt", 2, "True") 
objFileHandle.Write(Year(thisday) & "-" & Month(thisday) & "-" & Day(thisday) &" "& Hour(thistime) & ":" & Minute(thistime) & ":" & Second(thistime)) 
objFileHandle.Close 

Скопируйте этот и мимо него в свой .VBS файл и настроить то, что вы хотите, если вы не работаете с ISO 8601 Стандарт

1

VBScript не имеет гибкой функции форматирования даты, даты выводятся в соответствии с текущим языком хоста, на котором запущен скрипт.

FormatDateTime() accepts a few constants, которые изменяют свой вывод, но вы не можете передать строку пользовательского формата.

Это означает, что вы должны написать свою собственную функцию, которая создает не зависящий от языка формат.

В любом случае: пожалуйста использование ISO 8601, а не какие-либо сумасшедшие форматы луны, как mm/dd/yyyy.

+0

У меня есть права администратора на коробке - должен ли я изменить локальный? – Fearghal

+1

@ Fearghal - нет, потому что вы не можете знать, какие другие программы/лица полагаются на текущие региональные настройки. –

+0

Нет. Потому что вы действительно не хотите, чтобы сценарий выдавал разные выходные данные в зависимости от некоторой неясной настройки среды. Напишите сценарий таким образом, чтобы результат был стабильным и предсказуемым, а это означает: используйте правильную функцию форматирования. – Tomalak

0

Этот пакетный сценарий для Windows использует процедуру VBS для предоставления надежных переменных даты.

Вам нужно будет извлечь скрипт VBS и изменить его там, где это необходимо.

:: date time using WSH/VBS 
    :: datetime.bat V4.2 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    :: 
    :: This uses Windows Scripting Host to set variables to 
    :: the current date/time/day/day_number/week_of_year etc 
    :: for Win9x/ME/NT/W2K/XP/Vista/Win7/Win8 etc 
    :: Thanks go to Todd Vargo for his scripting 
    :: 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
    @echo off 
    set TmpFile="%temp%.\tmp.vbs" 
    echo> %TmpFile% n=Now 
    echo>>%TmpFile% With WScript 
    echo>>%TmpFile% .Echo "set m1=" + monthname(month(n), true) 
    echo>>%TmpFile% .Echo "set m2=" + monthname(month(n), false) 
    echo>>%TmpFile% .Echo "set woy=" + CStr(datepart("ww", n)) 
    echo>>%TmpFile% .Echo "set year=" + CStr(Year(n)) 
    echo>>%TmpFile% .Echo "set yr=" + Right(Year(n),2) 
    echo>>%TmpFile% .Echo "set month="+ Right(100+Month(n),2) 
    echo>>%TmpFile% .Echo "set day=" + Right(100+Day(n),2) 
    echo>>%TmpFile% .Echo "set hour=" + Right(100+Hour(n),2) 
    echo>>%TmpFile% .Echo "set min=" + Right(100+Minute(n),2) 
    echo>>%TmpFile% .Echo "set sec=" + Right(100+Second(n),2) 
    echo>>%TmpFile% .Echo "set dow=" + WeekDayName(Weekday(n),1) 
    echo>>%TmpFile% .Echo "set dow2=" + WeekDayName(Weekday(n)) 
    echo>>%TmpFile% .Echo "set iso=" + CStr(1 + Int(n-2) mod 7) 
    echo>>%TmpFile% .Echo "set iso2=" + CStr(Weekday(n,2)) 
    echo>>%TmpFile% End With 
    cscript //nologo "%temp%.\tmp.vbs" > "%temp%.\tmp.bat" 
    call "%temp%.\tmp.bat" 
    del "%temp%.\tmp.bat" 
    del %TmpFile% 
    set TmpFile= 
    set stamp=%year%-%month%-%day%.%hour%_%min%_%sec% 

    if not "%~1"=="" goto :EOF 

    echo The year is "%year%" or "%yr%" 
    echo The month is "%month%" "%m1%" "%m2%" 
    echo The day is "%day%" "%dow%" "%dow2%" 
    echo. 
    echo ISO8601 Day-Of-Week number is "%iso%" and week of year is: "%woy%" 

    echo. 
    echo The time in hh:mm:ss is "%hour%:%min%:%sec%" 
    echo The hour is "%hour%" 
    echo The minute is "%min%" 
    echo The second is "%sec%" 
    echo. 

    echo The date and time stamp is "%stamp%" 
    echo. 
    echo date A yyyymmdd "%year%%month%%day%" 
    echo date B mmddyyyy "%month%%day%%year%" 
    echo date C ddmmyyyy "%day%%month%%year%" 
    echo date D yymmdd "%yr%%month%%day%" 
    echo date E mmddyy "%month%%day%%yr%" 
    echo date F ddmmyy "%day%%month%%yr%" 
    pause 
    :: datetime.bat 
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
2

вопрос уже ответил, но я задавался вопросом, почему никто не говорит о настройке локали в нужный формат времени дата:

option explicit 

dim currentLocale 
currentLocale = GetLocale() 

SetLocale 2057  ' 2057 is the EN-GB locale 
msgbox now 
' Output: 15/11/2013 14:50:52 PM  
' Put back the original locale 
SetLocale currentLocale 

И для создания дата-время-формат без использования locale (настройка AM/PM иногда не отображается в зависимости от настроек в настройках региона и языковых настроек компьютера, на котором запущен скрипт), вы всегда можете использовать построитель .NET string и позволить платформе .NET сделать тяжелую работу для вас:

Option Explicit 

Dim sb : Set sb = CreateObject("System.Text.StringBuilder") 
sb.AppendFormat "{0:dd/MM/yyyy h:mm:ss tt}", Now() 
Msgbox sb.ToString() 
' Output: 15/11/2013 14:55:10 PM  
+0

Awww хорошее предложение - вот что я изначально был, но вижу, что я хочу обрабатывать его независимым образом, разбивая на куски дня, месяца, года и собирая себя. спасибо tho! – Fearghal

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

  • Нет связанных вопросов^_^