javascript - 将旧的 VBScript 转换为 JavaScript

标签 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,但就我个人而言,我希望它也能在其他浏览器上运行。

最佳答案

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

  • 尚不清楚 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 这样的现代库来摆脱日期操作和格式化等方面的繁重工作。

  • 这对白队有用吗? iUnit = (iElapsed Mod 3) + 1 +ve iElapsed 永远不会是 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/

相关文章:

javascript - 如何从 Meteor 对 MySQL 进行动态查询?

vbscript - 如何在 VBScript 中使用 "Alt + tab"快捷方式?

javascript - 将 vbs 转换为 js : for each . .. in

if-statement - 在 vbscript 中,您可以在 if 语句中使用两个可能的条件吗? (或者)

vbscript - 如何重新运行 TextStream.AtEndOfStream

javascript - 允许在 2 个字母数字之间使用可选连字符并限制空格的模式

Javascript 无法访问函数外的全局变量

javascript - Backbone : Calling Model fetch on a click of a button

javascript - 菜单性能问题

vbscript - VBScript中的if语句是否会遍历Err.Number