【问题标题】:VBS incorrect datetime formatVBS 不正确的日期时间格式
【发布时间】:2013-11-15 21:55:49
【问题描述】:

我有一个将 dateTimne 写入文件的 VBScript。

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

当我在我的服务器上手动运行它时,它会给我一个美国格式的 mm/dd/yyyy hh:mm:ss AM,例如 11/14/2013 9:20:56 AM。

当我在笔记本电脑上运行它时,它会返回我真正想要的英国格式 - dd/mm/yyyy hh:mm:ss AM 例如 14/11/2013 9:20:56 AM。

有什么想法吗?

【问题讨论】:

  • 请注意,"True" 只是偶然的True(因为任何非空字符串的计算结果为True - "False" 也可以正常工作)。使用实际的布尔值,而不是字符串。

标签: datetime vbscript regional-settings


【解决方案1】:

问题已经得到解答,但我想知道为什么没有人建议将语言环境设置为正确的日期时间格式:

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

对于不使用区域设置创建日期时间格式(AM / PM 设置有时不显示,具体取决于运行脚本的计算机的区域设置和语言设置配置),您始终可以使用.NET 字符串生成器,让 .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    

【讨论】:

  • Awww 好建议 - 这就是我最初所追求的,但看到我想通过拆分为日、月、年块并自行组装来以独立的方式处理它。谢谢你!
【解决方案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

如果您不使用 ISO 8601 标准,请将其复制并粘贴到您的 .VBS 文件中并调整您想要的内容

【讨论】:

    【解决方案3】:

    VBScript 缺乏灵活的日期格式化功能,日期是根据运行脚本的主机的当前语言环境输出的。

    FormatDateTime() accepts a few constants 修改其输出,但不能传递自定义格式字符串。

    这意味着您必须编写自己的函数来生成与语言环境无关的格式。

    无论如何:使用ISO 8601,而不是像mm/dd/yyyy这样的疯狂月亮格式。

    【讨论】:

    • @Fearghal - 不,因为您不知道哪些其他程序/人员依赖于当前的区域设置。
    • 没有。因为您真的不希望脚本根据某些晦涩的环境设置产生不同的输出。以输出稳定且可预测的方式编写脚本,这意味着:使用适当的自定义格式化函数。
    • 我不确定如何使用 ISO8601 执行此操作,您能帮忙吗?
    • 好的,我改变了我的本地。没关系,这是一个 PoC 系统,所以没有危险。我注意到手动运行这个脚本现在可以按预期工作,但是当它作为 SQL 服务器作业运行时,它仍然是美国版本。
    【解决方案4】:

    此 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
      ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      相关资源
      最近更新 更多