1

UTC 的事情真的让我发疯了......我试图在 UTC 中获得现场日期和时间,因此它不会影响任何时区。

我做什么,我创建一个日期对象

var d = new Date();

//convert it to utc
var utc = d.getTime() + (d.getTimezoneOffset() * 60000); 

var utc_date = new Date(utc);
utc_date.setHours(20,0,0)

console.log(utc_date.getTime()) // I want this to be same irrespective of timezone, but don't know why it is changing

请指导我在哪里做错了..?

更新: 我想在http://jsfiddle.net/HNyj5/上创建一个时间下拉列表,这里的概念是我使用所选日期的客户端或数据库的时间戳,然后动态生成此下拉列表。所以我希望服务器/客户端上的时间戳相似,这就是我尝试使用 UTC 日期对象的原因。

4

3 回答 3

1

您可以像这样从本地时间检索 UTC 日期时间(例如 timezone = GMT+0100):

var currentUTC = new Date; //=>Mon Mar 18 2013 13:53:24
currentUTC.setMinutes(currentUTC.getMinutes()+currentUTC.getTimezoneOffset();
 //=> currentUTC now: Mon Mar 18 2013 12:54:06

//or
var someUTC = new Date('1998/03/18 13:52'); //=> Wed Mar 18 1998 13:52:00
someUTC.setMinutes(currentUTC.getMinutes()+currentUTC.getTimezoneOffset();
 //=> someUTC now: Wed Mar 18 1998 12:52:00

或作为带有单行的日期扩展:

Date.prototype.UTCFromLocal = function(){
  var a;
  return new Date(Date.prototype.setMinutes
          .call(a = this,a.getMinutes()+a.getTimezoneOffset()));
}
// usage (current date and time = Mon Mar 18 2013 14:08:14 GMT+0100
var d = new Date().UTCFromLocal(); //=> Mon Mar 18 2013 13:08:14

要检索(从 UTC 日期时间),您可以使用:

Date.prototype.LocalFromUTC = function(){
  var a;
  return new Date(Date.prototype.setMinutes
          .call(a = this,a.getMinutes()-a.getTimezoneOffset()));
}
于 2013-03-18T12:57:52.697 回答
0

请指导我在哪里做错了..?

您正在构建一个utc_date完全不同的时代,以某种方式受到getTimezoneOffset. 做就是了

var d = new Date();
d.getTime(); // milliseconds since epoch

或者

Date.now();

如果你在 UTC-land 工作,你应该使用d.setUTCHours而不是 local-timezone-dependent setHours

于 2013-03-18T12:55:57.013 回答
0

实际上,我期望 JS 做的是,如果我在Date构造函数中传递时间戳,它应该使对象 wrt 那个时间戳,但它将它转换localtimezone为对我造成问题的对象。

所以我为解决这个问题做了什么,我通过传递所选日期的字符串来获取日期对象。

var date = new Date(selected_date_str);而不是传递时间戳

因为我正在使用 UTC 时间戳作为其值来下拉时间。下拉列表的开始hour:min是动态的,我在函数中作为参数传递,from_hr就像我想从 20:00 创建时间下拉列表然后我通过from_hr = 20

所以现在我为所选日期设置小时

date.setHours(from_hr, 0, 0);

然后我制作了一个utc_time变量来制作下拉列表的值

var utc_time = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), from_hr, 0, 0, 0);

这将保留在所有时区,这是我将用作基础的。然后在循环中我增加了 15 分钟的时间

    var count = 0;
    jQuery(elem).html('');
    while(count <= 95){
        var option = '<option value="{0}">{1}:{2}</option>'.format(utc_time/1000, ('0' + date.getHours()).slice(-2), ('0' + date.getMinutes()).slice(-2)); //here i used a format prototype, which you can find in the jsfiddle link of my question
        jQuery(elem).append(option);
        utc_time += 15 * 60 * 1000; //adding 15 mins in the utc timestamp
        date.setMinutes(date.getMinutes() + 15)
        count++; }

我将 utc_time 除以 1000 以使其与 php 兼容,因为我要从这里检索值并保存在 db 中。

于 2013-03-22T16:41:12.857 回答