我正在使用Python在Google App Engine上开发出价系统。产品在预定义的时间开放以进行投标,并且投标持续3分钟。产品价格在3分钟内每秒下降一个恒定值,直到它为零。按下“出价”按钮的出价者首先赢得出价。此应用程序中的一个关键问题是所有用户之间的时间应该完全同步,以便每个人同时看到相同的价格。以下是我到目前为止所提出的内容,但它的定时器不准确。
当用户访问或刷新页面时,Python代码会将服务器时间传递给javascript计时器,并且计时器开始倒计时。简化的javascript如下:
var count = {{timeToBid}}; // 'timeToBid' is in seconds and is inserted by the template engine
var price =={{initialPrice}} // The initial product price
var currentPrice; // Current price
function updateTime() {
timeStr = ...; // Set the time string to be HH:MM:SS
$("#timeToBid").html(timeStr); // Display time in the 'timeToBid' div
if (count <= 180) { // Start bidding
currentPrice = ...; // Calculate the current price
$("#currentPrice").html(currentPrice); // Update current price
}
count--;
setTimeout(updateTime, 1000); // Executed every second
}
updateTime();
上述javascript受到用户浏览器中未同步的计时器以及未同步的服务器时间的影响(请参阅this)。每个浏览器中显示的当前价格可能在很大的范围内变化,这使得系统完全无法使用。这是一个相当复杂的问题,我要求提供良好的解决方案。一到两秒的时间不准确是可以接受的。我的问题:
(a)为了使javascript计时器更准确,我计划使用AJAX每10秒检索一次服务器时间,然后更新'count'。这是一个好的解决方案吗?还是有其他选择?
$.ajax({
url: "/getServerTime",
cache: false,
success: function(serverCount) {
count = parseInt(serverCount);
return false;
}
});
(b)我完全不知道如何解决服务器时间不一致问题。有人可以帮忙吗?感谢。
答案 0 :(得分:1)
App Engine服务器上的系统时钟保持同步:请参阅this authoritative answer。
每个App Engine HTTP响应都有Date
标头,如此Date: Wed, 24 Apr 2013 06:03:37 GMT
。您可以使用它来同步浏览器和服务器时间。