在javascript中显示客户端时间而不是服务器时间

时间:2012-07-04 11:32:25

标签: javascript datetime

我遇到了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并将其作为参数传递时,它运行良好。

有什么想法吗?

4 个答案:

答案 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);