javascript - UTC日期对象操作

时间:2013-03-18 12:35:28

标签: javascript date utc

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日期对象的原因。

3 个答案:

答案 0 :(得分:1)

您可以从当地时间检索UTC日期时间(例如时区= 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()));
}

答案 1 :(得分:0)

  

请指导我做错的地方..?

你正在构建一个utc_date,这是一个完全不同的时间,不知何故偏向getTimezoneOffset。只是做

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

Date.now();

如果您在UTC-land工作,则应使用d.setUTCHours而不是依赖于本地时区的setHours

答案 2 :(得分: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中。