我正在处理我雇主的内部网络,他们想要保存一段旧的 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,但就我个人而言,我希望它也能在其他浏览器上运行。
最佳答案
重写时需要考虑几个因素:
尚不清楚
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
相当于 VBScriptint
在本节中:iLeapYears = (d.getFullYear() - 2008) / 4;
使用像 moment.js 这样的现代库来摆脱日期操作和格式化等方面的繁重工作。
这对白队有用吗?
iUnit = (iElapsed Mod 3) + 1
+veiElapsed
永远不会是 0 。 VBScript 可以有基于 0 或 1 的数组,但没有Option Base 1
因此必须假设aUnitCOlor = Array("white","green","blue","red")
然后aUnitCOlor(0)
是白色的。
所以 2017 年 2 月 27 日是绿色的一天,可能是因为我的时区是 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';
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<div id="out"></div>
关于javascript - 将旧的 VBScript 转换为 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477150/