我遇到了javascript Date()
函数的奇怪问题,这些都是细节
服务器端:Struts(ActionForm,Action类,jsp)
客户端:jQuery,javascript
现在,我需要在页面上使用服务器时间并使用javascript进行操作。所以,我在action类中做了Calendar.getInstance().getTimeinMillis();
并将其保存为ActionForm属性。
现在,在客户端,我从styleId获得了long值(timeinMillis)。但是,当我做的时候操纵
var curTime = parseInt($("#serverTime").val());
var serverTime = new Date(curTime);
现在,虽然我们提供服务器的timeinMillis,但serverTime正在提供客户端机器日期而不是服务器日期。
奇怪的是,当我从服务器传递日期的字符串值而不是long timeinMillis并将其作为参数传递时,它运行良好。
有什么想法吗?
答案 0 :(得分:2)
这是因为您的javascript在客户端计算机上运行,因此当您在javascript中创建新的Date()时,它会获取客户端计算机时间。
如果您将服务器日期作为字符串传递,则回答第二个查询,它将创建该日期的日期对象。
使用以下功能
function calcTime(offset) {
// create Date object for current location
d = new Date();
// convert to msec, add local time zone offsetand get UTC time in msec
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
// create new Date object with supplied offset
nd = new Date(utc + (3600000*offset));
// return time as a string
return "The Server time is " + nd.toLocaleString();
}
在这里,您需要使用UTC
传递服务器时间的偏移量答案 1 :(得分:2)
最后在上述提示的帮助下解决了这个问题。
从java方面,使用日光保存选项从UTC偏移。
所以,在Action类
中Calendar c = Calendar.getInstance();
TimeZone z = c.getTimeZone();
int offset = z.getOffset(c.getTimeInMillis());
这给出了本地时区和UTC时区的偏移量,包括白天节约
在javascript上,我用了,
var now = new Date();
var now_utc = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
var sd = new Date(now_utc.getTime() + offset);
alert("The Server time is " + sd.toLocaleString());
并且,使用日间节能选项可以提供正确的服务器时间。
非常感谢你的帮助,没有他们,就无法解决问题。干杯!
答案 2 :(得分:1)
如果您的服务器和客户端时间位于不同的时区,并且您希望向用户显示此差异,则您还必须向客户端发送时区信息。
Calendar.getInstance().getTimeinMillis()
返回自纪元以来的毫秒数,但它没有说明时区的任何内容。自1970/1/1午夜 UTC 以来只有几毫秒,并且在任何时刻,这个数字在任何系统上都是相同的(好的,考虑到时间同步),无论系统的时区如何。这可能会让您觉得您获得的是客户时间而不是服务器。
这与日期的字符串表示一起使用的原因是其中包含的时区信息,以及Javascript在构造Date
对象时解析它并将其考虑在内的能力。
答案 3 :(得分:1)
PHP中的一个简单解决方案:
var phpDate = '<?php echo date('Y/m/d H:m:s');?>'
, serverDate = new Date(phpDate)
, month = serverDate.getMonth()+1 //getMonth() returns a 0-based number.
, day = serverDate.getDate()
, year = serverDate.getFullYear();
console.log(year + '-' + month + '-' + day);