我正在研究我的雇主的内部网络存在,并且有一个他们想要保存的旧版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浏览器,但就个人而言,我也希望它能够在其他浏览器上运行。
答案 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) + 1
,iElapsed
永远不会为0。 VBScript可以有基于0或1的数组,但是没有Option Base 1
,所以必须假设对于aUnitCOlor = Array("white","green","blue","red")
,aUnitCOlor(0)
是白色的。
所以27/2/17是绿色的一天,因为我的时区是GMT + 11。你在哪个时区?
// 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;