将旧的VBScript转换为JavaScript

时间:2017-02-27 03:01:50

标签: javascript vbscript

我正在研究我的雇主的内部网络存在,并且有一个他们想要保存的旧版VBScript。它在IE中显示,但在任何其他浏览器中都不起作用,因为我所理解的VBScript已被弃用。此脚本获取当前日期并计算消防部门单位日历中的“单位”日期。例如今天(2月26日)是“1单位”或“绿色单位”,其中下一个是2个单位/蓝色单位,然后是3个单位/红色单位。如果是闰年,则额外的一天被视为“0单位”或“白单位”。

所以这是旧的VBScript:

Sub UpdateClock()
  Dim iDOW, iElapsed, iLeapYears, iUnit, sDate, sTime, aDOW, aUnitColor, sHTML

  aUnitCOlor = Array("white", "green", "blue", "red")
  aDOW = Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

  iElapsed = DateDiff("d", "3/10/2008", Date)
  iDOW = WeekDay(Date)
  iLeapYears = Int((Year(Date)-2008)/4)
  If Month(Date) > 2 Then iLeapYears = iLeapYears
  iElapsed = iElapsed + iLeapYears
  iUnit = (iElapsed Mod 3) + 1
'  sDate = aDOW(iDOW) & " " & FormatDateTime(Date,2)
  sDate = WeekdayName(DatePart("w", Now())) & " " & FormatDateTime(Date, 2)

  sTime = FormatDateTime(Time, 3)

  sHTML = "<font size='1' face='Franklin Gothic Book'>" & sDate & "; " & sTime & "<br>"
  sHTML = sHTML & "<font size='1' face='Franklin Gothic Book' color='" & aUnitColor(iUnit) & "'>" & CStr(iUnit) & " Unit</font><br>"

  Clock.innerHTML = sHTML
End Sub

setInterval "UpdateClock()", 1000

以下是我为尝试重新创建它而编写的JavaScript:

// This script is intended to calculate the fire department "unit" day
var d, sd, pd, psd, iElapsed, iLeapYears, iUnit
// Sets start date
sd = new Date("March 10, 2008");
// Sets current date
d = new Date();

// Calculates the milliseconds between each date and January 1, 1970
psd = sd.getTime();
pd = d.getTime();
// Calculates milliseconds between the two dates and divides by the number of milliseconds in a day to determine how many days have passed
iElapsed = (pd - psd) / 86400000;

// Calculates leap year
if (d.getMonth() > 1) {
  iLeapYears = (d.getFullYear() - 2008) / 4;
} else {
  iLeapYears = 0;
}
iElapsed = iElapsed + iLeapYears;
iUnit = (iElapsed % 3 + 1);

document.getElementById("DisplayUnitDay").innerHTML = iUnit;

对于当前日期,它给出了我的结果3.9499762037034998(基于我的上次刷新)但它应该告诉我单位日是1而不是3. 3单位是从现在开始的两天。我觉得我要么缺少一些简单的东西,要么我正在工作的VBScript有缺陷(或者我可能没有正确地解释它)。

有人能指出我的方向吗?我的意思是我的雇主要求所有内部计算机使用IE浏览器,但就个人而言,我也希望它能够在其他浏览器上运行。

1 个答案:

答案 0 :(得分:1)

在重写时需要考虑几个因素:

  • 目前尚不清楚sd是2008年3月10日还是2008年10月3日 - 无论如何,似乎他们都给出了1的答案,这可能是一个幸运的巧合!

  • VBScript说If Month(Date) > 2 Then,但您的javascript说(d.getMonth() > 1)是否需要更正

  • VBScript有这一行iLeapYears = Int((Year(Date)-2008)/4) - 您应该在此部分使用Math.floor作为VBScript int的等效内容:iLeapYears = (d.getFullYear() - 2008) / 4;

  • 使用像moment.js这样的现代图书馆来摆脱日期操纵和格式化等繁重的工作。

  • 它对白队有用吗?对于+ ve iUnit = (iElapsed Mod 3) + 1iElapsed永远不会为0。 VBScript可以有基于0或1的数组,但是没有Option Base 1,所以必须假设对于aUnitCOlor = Array("white","green","blue","red")aUnitCOlor(0)是白色的。

所以27/2/17是绿色的一天,因为我的时区是GMT + 11。你在哪个时区?

&#13;
&#13;
// unit colors
var unitColor = ['white', 'green', 'blue', 'red'];

// elapsed days
var start = moment(new Date('March 10, 2008'));
var today = moment(new Date);
var elapsed = today.diff(start, 'days');

// update for leap year
if (today.format('M') > 2) {
  elapsed += Math.floor((today.format('Y') - 2008) / 4);
}

// get unit
unitIndex = (elapsed % 3) + 1;

// render
el = document.getElementById('out');
el.innerHTML = today.format('YYYY-MM-DD') + ' is a day for the ' + unitColor[unitIndex] + ' team';
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<div id="out"></div>
&#13;
&#13;
&#13;