2012-07-04 86 views
1

我为JavaScript Date()功能的奇怪的问题,这些都是细节客户端时间在JavaScript

服务器端:Struts的(的ActionForm,Action类,JSP)
客户端:jQuery的,javascript

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

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

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

现在,serverTime是提供客户机的日期和不服务器日期虽然我们提供服务器的timeinMillis。

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

有什么想法?

+0

嗯....多少做你的服务器和客户端的时间不同 - 是一个时区的差异? –

+0

@达维达。是的,这是一个时区差异。比如说服务器在伦敦运行,而人从美国进入,我们想要的是坐在伦敦的人会看到美国和本地时间的服务器时间。 –

回答

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

而且,这可以为您提供正确的服务器时间和日间节能选项。

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

+0

如果客户端和服务器不会同步(例如,某人在笔记本电脑上有5分钟时间休息)会怎么样?我会考虑发送服务器时间戳和它的时区偏移量,或者一些(标准化的)日期文本表示 - 如果我必须实现这一点,我可能会坚持使用后者。 –

+0

你是非常正确的大卫,我同意你的看法,并且正在考虑同样的事情,但是需要坚持一些事情,看看这个http://meta.stackexchange.com/questions/134925/user-reputation-graph -uses-client-date –

1

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

Calendar.getInstance().getTimeinMillis()返回自纪元以来的毫秒数,但它没有提及任何有关时区的内容。距离1970/1/1 UTC午夜只有几毫秒,并且在任何时刻,这个数字在任何系统上都是一样的(当然,假设时间同步),而不管系统的时区。这可能会给你一个印象,那就是你得到的是客户端时间而不是服务器。

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

+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

+0

嗨,你的回答很有帮助,但仍然没有得到确切的时间。不过,我解决了这个问题,看看我的答案。 –

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

您应该多阅读并理解响应上下文。答案是对的,虽然它对你没有用处,但可能适用于其他人。 – Liko