3

我遇到了javascriptDate()函数的奇怪问题,这些是细节

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

现在,我需要页面上的服务器时间并使用 javascript 进行操作。所以,我 Calendar.getInstance().getTimeinMillis();在动作类中做了,并将其保存为 ActionForm 属性。

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

var curTime = parseInt($("#serverTime").val());
var serverTime = new Date(curTime);

现在,serverTime 提供的是客户端机器日期而不是服务器日期,尽管我们提供的是服务器的 timeinMillis。

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

任何的想法?

4

4 回答 4

5

这是因为您的 javascript 在客户端计算机上运行,​​因此当您在 javascript 中创建 new 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 传递您的服务器时间的偏移量

于 2012-07-04T12:19:37.457 回答
3

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

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

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

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

于 2012-07-05T06:40:44.097 回答
2

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);
于 2014-07-01T17:20:33.150 回答
1

如果您的服务器和客户端时间位于不同的时区,并且您想向用户显示这种差异,那么您还必须向客户端发送时区信息。

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

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

于 2012-07-04T12:16:43.840 回答