【问题标题】:javascript - UTC date object manipulationjavascript - UTC 日期对象操作
【发布时间】:2013-03-18 12:35:28
【问题描述】:

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

【问题讨论】:

标签: javascript date utc


【解决方案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()));
}

【讨论】:

  • 您是否使用本地时区输出toString() 来输出currentUTC 的UTC 字符串? new Date() 是 UTC,你只需要使用toUTCString() 来查看它
  • 不,我只是在这里使用toString
  • 你的UTCFromLocal函数的问题是你的结果Mon Mar 18 2013 13:08:14还在GMT+0100中
  • AFAIK OP 查找 UTC 日期时间,而不是日期字符串。使用UTCFromLocal 方法转换的日期可以使用new Date().UTCFromLocal().getTime() 存储为时间戳,并使用[new Date(someconverteddatetime)].LocalFromUTC() 作为本地检索
  • 但是 JS 中的日期时间是无时区的,默认情况下是“UTC”。所以只需new Date().getTime() 用于存储和new Date(timestamp) 用于检索,然后获取toString() 用于本地或toUTCString() 用于UTC 字符串参考。
【解决方案2】:

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

您正在构建一个完全不同的时间utc_date,不知何故受到getTimezoneOffset 的影响。做吧

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

或

Date.now();

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

【讨论】:

  • 谢谢Bergi,utc_date 并没有完全不同,你看我是根据时间戳生成一个新的日期(utc_date),它使用当前日期作为参考
  • 但是你为什么要创建一个不同的时间戳(utc)?
  • 我用它来制作 UTC 日期对象。这样我就可以处理该对象,您可以在 jsfiddle jsfiddle.net/HNyj5 上看到我想要获取的内容
  • 没有“UTC”日期对象 - JS 中的Date 对象没有时区信息。您可以通过 toUTCString() 或 toString 获取 UTC 表示以获取本地表示(不幸的是,这是默认值)
  • 在小提琴上:我不确定它应该做什么。只有我可以告诉你,将时间戳乘以 1000 会产生奇怪的值,请查看它们的实际值 jsfiddle.net/HNyj5/1(我将 ISO 字符串表示形式存储在选项值中)
【解决方案3】:

实际上,我期望 JS 做的是,如果我在 Date 构造函数中传递时间戳,它应该使对象 w.r.t 具有该时间戳,但它会将其转换为 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 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2019-06-05
    相关资源
    最近更新 更多