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

Client Time shown instead of server Time in javascript

本文关键字:时间 javascript 服务器 客户端 显示      更新时间:2023-09-26

我对javascript Date()函数的奇怪问题感兴趣,这些是细节

服务器端:Struts(ActionForm,Action class,jsp)
客户端 : jQuery, javascript

现在,我需要在页面上使用服务器时间并使用javascript进行操作。因此,我在操作类中Calendar.getInstance().getTimeinMillis();,并将其另存为操作窗体属性。

现在,在客户端,我从 styleId 中获取了长整型值 (timeinMillis)。但是,操纵,当我这样做

var curTime = parseInt($("#serverTime").val());
var serverTime = new Date(curTime);
现在,服务器

时间提供客户端计算机日期而不是服务器日期,尽管我们提供的是服务器的时间。

奇怪的部分是,当我从服务器传递日期的字符串值而不是 long timeinMillis 并将其作为参数传递时,它运行良好。

知道吗?

这是因为你的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 传递服务器时间的偏移量

终于在

上述提示的帮助下解决了这个问题。

java 方面,使用夏令时选项从 UTC 偏移。

所以,在行动类中

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());

而且,这通过夏令时选项提供了正确的服务器时间。

非常感谢您的帮助,没有他们,就无法解决。干杯!

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

如果您的服务器和客户端时间位于不同的时区,并且您希望向用户显示此差异,则还必须将时区信息发送到客户端。

Calendar.getInstance().getTimeinMillis() 返回自纪元以来的毫秒数,但它不说明时区的任何信息。它只是自 1970 年 1 月 1 日 UTC 午夜以来的毫秒数,在任何时刻,这个数字在任何系统上都是相同的(好吧,考虑到时间是同步的),无论系统的时区如何。这可能会给您留下您获得客户端时间而不是服务器时间的印象。

这适用于日期的字符串表示的原因是其中包含的时区信息,以及 Javascript 解析该信息并在构造Date对象时将其考虑在内的能力。