比较服务器时间和浏览器时间

Compare Server Time and Browser Time

我的 table 有 3 列:FileNameLastUpdateTime 和一个“重新启动”按钮。

只有在上次更新时间超过 20 分钟之前,我才需要显示重启按钮。我从服务器获取最后更新时间。 d = new Date() 给出本地浏览器时间,但 lastUpdateTime 来自服务器。服务器与客户端浏览器处于不同的时区。

如果服务器和浏览器处于同一时区,则以下代码有效。如果服务器和浏览器处于不同的时区,您对如何解决这个问题有什么建议吗?

此应用程序应该 运行 美国和欧洲的任何地方。

var lastUpdatedTime = (gridData[i].LastTimeUpdated);
var d = new Date();
//deducting 20 min from current time
var deductTwenty = d.setMinutes(d.getMinutes() - 20); 
var parsedupdatetime = Date.parse(lastUpdatedTime);                          

// If the last update time is not 20 ago, hide it. 
if (parsedupdatetime > deductTwenty) {
    newrestartButton.hide();
}

服务器日期解析可能出了问题。查看 Date.parse function spec - 并确保您的服务器返回的内容可以像 ISO8601 格式的日期一样被正确解析。

在 .cshtml 文件中使用 .NET 获取服务器端的日期。假设您使用 MVC(因为您标记了这个问题 kendo-asp.net-mvc)。

@{
    var deductTwenty = DateTime.Now.AddMinutes(-20);
}

<script>
    var jsDeductTwenty = new Date(@deductTwenty.Year, @deductTwenty.Month-1, @deductTwenty.Day, @deductTwenty.Hour, @deductTwenty.Minute);
</script>

结果:

您必须将您的 lastUpdatedTime 转换为客户端时区,这意味着您应该在减去 20 分钟的日期时将服务器时间转换为客户端时间。您可以使用 momentjs, moment-timezone and jstimezonedetect 来实现这一点。

你的代码应该是这样的

// get current client timezone with jstimezonedetect
var currentTz = jstz.determine().name(); // e.g "Europe/London"

// parse last update time to moment object and change its timezone
var lastUpdateTime = moment(lastUpdatedTime, "M/DD/YYYY hh:mm a").tz(currentTz);

// create date using moment and deduct 20 mins from it
var deductTwenty = moment().subtract(20, 'minutes');                     

// now compare
if (lastUpdateTime > deductTwenty) {
    newrestartButton.hide();
}

希望对您有所帮助。