【问题标题】:How to convert from JScript epoch to/from VBScript epoch?如何从 JScript 纪元转换到/从 VBScript 纪元?
【发布时间】:2012-06-07 19:22:56
【问题描述】:

VBScript 在内部将日期表示为双精度,小数点左侧的部分表示自“0 年”以来的天数,小数点右侧表示当天午夜以来的毫秒数。 “0 年”似乎是 1899 年,如果

WScript.Echo Year(CDate(0))

值得信赖。

另一方面,JScript 以 1970 年的“0 年”开始,并将时间表示为从那时到现在的总毫秒数。

有人可以指点我使用基础的 Double 或 Long 日期格式的代码,该代码可以将 JScript 日期转换为 VBScript 日期,然后再按照这些方式返回吗?

【问题讨论】:

    标签: date vbscript epoch jscript


    【解决方案1】:

    纪元是任何语言的纪元,自 1970 年 1 月 1 日 00:00:00 UTC 起过去的秒数。

     'Get current epoch with vbScript ...
      dim epoch
      epoch = dateDiff("s", "01/01/1970 00:00:00", now())
      wScript.echo "epoch now = " & epoch
    

    现在时代 = 1346891880

     'And convert it back (probably the one you need) ...
      dim datetime
      datetime = dateAdd("s", epoch, "01/01/1970 00:00:00")
      wScript.echo "datetime from epoch " & epoch & " = " & datetime
    

    1346891880 纪元的日期时间 = 6/09/2012 12:38:00 AM

    【讨论】:

      【解决方案2】:

      使用时间戳生成日期并转换为双精度。

      Function CurrentTZOffset()
          With CreateObject("WScript.Shell") 
              CurrentTZOffset = - .RegRead( _ 
              "HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
          End With
      End Function
      
      Dim dblVbEpoch
          dblVbEpoch = CDbl(DateAdd("s", 1336708766790 / 1000, #1970/1/1#))
      
      WScript.Echo "VB Epoch :", dblVbEpoch
      WScript.Echo "VB Date (GMT):", CDate(dblVbEpoch)
      WScript.Echo "VB Date (LOCAL):", DateAdd("n", CurrentTZOffset(), CDate(dblVbEpoch))
      WScript.Echo "JS Epoch From VB Epoch:", DateDiff("s", #1970/1/1#, CDate(dblVbEpoch)) * 1000
      

      【讨论】:

      • 该代码有问题。如果我将 ch 设置为 1336708766790(2012 年 5 月 11 日 11:59:26.790),然后运行该代码,它会显示:VB Epoch : 41040.1662731481 VB Date : 11/05/2012 3:59:26 AM JS Epoch From VB纪元:1336708766000
      • @boost 实际上没有。它应该是基于 GMT 的。 JS 显示本地日期取决于操作系统、语言环境或浏览器。例如new Date(1336708766790) 将为我返回 11-May-2012 06:59:26.790 因为时区。如果要本地化日期,则需要获取当前时区偏移量。我更新了关于这个的答案。
      • js 返回毫秒,所以 parseInt((new Date).getTime() / 1000) = proper_epoch.
      • @ekerner 这是正确的,但这里不是这样。这都是关于 VBScript 的,它处理不同时期的日期。顺便说一句,纪元不是任何语言的纪元。纪元日期是一个参考时间点,它取决于平台。 00:00:00 UTC, January 1, 1970 是 Unix 时间戳记的时代。您可以看到 here 存在的其他纪元日期。
      • 哇。我承认。谢谢。
      【解决方案3】:

      如果您只对在 VBScript 日期和 JScript 日期之间进行转换感兴趣,该功能已通过 Date constructorgetVarDate 方法内置到 JScript 中。

      一个小例子:

      <job id="test">
          <script language="JScript" id="jsLibrary">
              function JSExample() {
                  var jsDate = new Date(2014, 4, 12);
                  VBPrintJSDate(jsDate);
              }
      
              function JSPrintVBDate(vbDate) {
                  var jsDate = new Date(vbDate);
                  WScript.Echo(jsDate.toUTCString());
              }
          </script>
          <script language="VBScript" id="vbLibrary">
              Option Explicit
      
              Sub VBExample
                  Dim vbDate
                  vbDate = DateSerial(2000, 11, 30)
                  JSPrintVBDate(vbDate)
              End Sub
      
              Sub VBPrintJSDate(jsDate)
                  Dim vbDate
                  vbDate = jsDate.getVarDate()
                  WScript.Echo FormatDateTime(vbDate)
              End Sub
          </script>
          <script language="VBScript" id="main">
              Option Explicit
      
              VBExample
              JSExample
          </script>
      </job>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 2019-12-27
        • 2020-05-05
        相关资源
        最近更新 更多