特殊格式的DateAdd()

时间:2012-05-16 08:24:15

标签: asp-classic vbscript

我已经尝试了所有我看到的方式在特定日期添加一个月然后以特定格式返回,但我不知所措。这是我的代码,但我需要格式化它:

replace( formatdatetime( dateadd( "m" , 1 , request("date") ), 0 ) , "/" , "-" ) & "' )

request("date")采用yyyyy-dd-mm hh:mm:ss格式,这就是我需要新约会的方式。

3 个答案:

答案 0 :(得分:1)

以下内容应该是完美的:

replace( formatdatetime( dateadd( "m" , 1 , cDate(request("date")) ), 0 ) , "/" , "-" )

请注意使用cDate函数将值明确转换为日期。

编辑:

我删除了代码的最后一部分& "' ),否则会给我一个错误。

答案 1 :(得分:1)

使用日期时,处理正确的数据(子)类型尤为重要。将字符串提供给期望日期的函数(并依赖于'VBScript - 以及您的本地设置 - 将做正确的事情')是危险的。

使用替换永远不会改变日期部分的顺序。

FormatDateTime取决于本地/区域设置,应该避免作为灾难的可靠途径。

解决此问题的一种方法+大多数与VBScript中的花式格式化相关的其他问题是使用.Net System.Text.StringBuilder

鉴于Lib.vbs:

' Lib.vbs - simple VBScript library/module
' use
'  ExecuteGlobal goFS.OpenTextFile(<PathTo\Lib.vbs>).ReadAll()
' to 'include' Lib.vbs in you main script

Class ToBeAShamedOf
  Public a
  Public b
End Class ' ToBeAShamedOf

Class cFormat
  Private m_oSB
  Private Sub Class_Initialize()
    Set m_oSB = CreateObject("System.Text.StringBuilder")
  End Sub ' Class_Initialize
  Public Function formatOne(sFmt, vElm)
    m_oSB.AppendFormat sFmt, vElm
    formatOne = m_oSB.ToString()
    m_oSB.Length = 0
  End Function ' formatOne
  Public Function formatArray(sFmt, aElms)
    m_oSB.AppendFormat_4 sFmt, (aElms)
    formatArray = m_oSB.ToString()
    m_oSB.Length = 0
  End Function ' formatArray
End Class ' cFormat

和main.vbs:

' main.vbs - demo use of library/module Lib.vbs

' Globals
Dim gsLibDir : gsLibDir = ".\"
Dim goFS     : Set goFS = CreateObject("Scripting.FileSystemObject")

' LibraryInclude
ExecuteGlobal goFS.OpenTextFile(goFS.BuildPath(gsLibDir, "Lib.vbs")).ReadAll()

WScript.Quit demoDateFormat()
WScript.Quit main()

Function main()
  Dim o : Set o = New ToBeAShamedOf
  o.a = 4711
  o.b = "whatever"
  WScript.Echo o.a, o.b
  main = 1 ' can't call this a success
End Function ' main

Function demoDateFormat()
  Dim sD   : sD       = "2012-05-16 01:02:03" ' near future; not yyyyy!
  Dim dtD  : dtD      = CDate(sD)
  Dim dtDM : dtDM     = DateAdd("m", 1, dtD)
  Dim oFmt : Set oFmt = New cFormat
  WScript.Echo oFmt.formatArray( _
      "   sD: {1}{0}  dtD: {2}{0} dtDM: {3}{0}dtDM': {4}" _
    , Array(vbCrLf, sD, dtD, dtDM, oFmt.formatOne("{0:yyyy-MM-dd hh:mm:ss}", dtDM)))
  demoDateFormat = 0 ' seems to be decent
End Function ' demoDateFormat

你会得到:

cscript main.vbs
   sD: 2012-05-16 01:02:03
  dtD: 16.05.2012 01:02:03
 dtDM: 16.06.2012 01:02:03
dtDM': 2012-06-16 01:02:03

(见this answer

的背景

答案 2 :(得分:1)

这可能有所帮助:

FormatDateTime(DateAdd("M",1,DateSerial(Left(request("date"),4),Mid(request("date"),9,2),Mid(request("date"),6,2))) & " " & Mid(request("date"),12,8),d,0)

它基本上将字符串转换为本机格式的有效日期,添加1个请求的月份,然后重建字符串。

注意:请求(“日期”)看起来好像它返回当前日期时间,因此以这种方式运行它可能会生成一个大约一秒钟的最终值,如果这是一个问题那么你将更好地存储静态变量中的值,否则这应该是可以的。