Как преобразовать из эпохи JScript в/из эпохи VBScript?

VBScript внутренне представляет даты как двойное число, дни с «года 0» в части слева от десятичной точки и миллисекунды с полуночи для текущего дня справа от десятичной точки. "Год 0" кажется 1899, если

WScript.Echo Year(CDate(0))

можно доверять.

JScript, с другой стороны, начинается с «0-го года» 1970 года и представляет время как общее количество миллисекунд с того момента до настоящего момента.

Может ли кто-нибудь указать мне код, который делает возможным преобразование дат JScript в даты VBScript и обратно по этим строкам, используя базовый двойной или длинный формат даты?


person bugmagnet    schedule 03.06.2012    source источник


Ответы (3)


Сгенерируйте дату, используя метку времени, и преобразуйте ее в двойную.

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
person Kul-Tigin    schedule 03.06.2012
comment
Что-то не так с этим кодом. Если я установлю ch на 1336708766790 (11 мая 2012 г. 11:59:26.790), а затем запущу этот код, он скажет: VB Epoch: 41040.1662731481 VB Date: 05.11.2012 3:59:26 JS Epoch From VB Эпоха: 1336708766000 - person bugmagnet; 03.06.2012
comment
@boost На самом деле нет. Он основан на GMT, как и должно быть. JS показывает локальные даты в зависимости от операционной системы, локали или браузера. например new Date(1336708766790) вернет 11-May-2012 06:59:26.790 для меня из-за часового пояса. Если вы хотите локализовать дату, вам нужно получить текущее смещение часового пояса. Я обновил ответ по этому поводу. - person Kul-Tigin; 03.06.2012
comment
js возвращает миллисекунды, поэтому parseInt((new Date).getTime() / 1000) = correct_epoch. - person ekerner; 13.08.2017
comment
@ekerner Это правильно, но здесь было не так. Все дело в VBScript, который обрабатывает даты с другой эпохой. Кстати, эпоха не является эпохой ни на одном языке. Дата эпохи является точкой отсчета времени и зависит от платформы. 00:00:00 UTC, January 1, 1970 - это эпоха Unix Time Stamp. Вы можете увидеть здесь другие существующие даты эпох. - person Kul-Tigin; 13.08.2017
comment
Вот это да. Я уступаю. Спасибо. - person ekerner; 13.08.2017

Эпоха — это эпоха на любом языке, количество секунд, прошедших с 00:00:00 UTC, 1 января 1970 года.

 '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 = 09.06.2012 00:38:00

person ekerner    schedule 05.09.2012

Если вас интересует только преобразование дат VBScript в даты JScript, эта функция встроена в JScript через Date конструктор и getVarDate.

Небольшой пример:

<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>
person Cheran Shunmugavel    schedule 13.08.2014