【问题标题】:Javascript getTime since beginning of 2012 in milisecondsJavascript 获取自 2012 年初以来的时间(以毫秒为单位)
【发布时间】:2012-01-08 19:00:07
【问题描述】:

getTime() 为您提供自 1970 年 1 月 1 日以来的毫秒数。

如何获取自 2012 年 1 月 1 日以来的毫秒数?

这是我目前拥有的:

var n = new Date()
var a = n.getTime()

console.log (a)

【问题讨论】:

  • 自格林威治标准时间 2012 年 1 月 1 日 00:00:00 起,您需要更具体一些吗?
  • 只需构建一个自 2012 年 1 月 1 日 00:00 以来的日期和 .getTime() 的对象,然后就可以有所作为了

标签: javascript object date time


【解决方案1】:

怎么样:

var diff = new Date() - new Date(2012, 0, 1); // diff is in milliseconds

用于计算差异,包括本地时区偏差,或

var diff = new Date() - Date.UTC(2012, 0, 1); // diff in ms

寻求更科学的解决方案。

请注意,Javascript 中的月份是从零开始的。

【讨论】:

  • Date 构造函数将创建一个对象,该对象的时间值具有对应于本地时区的偏移量。与此同时,OP 已澄清他们希望改为 2012 年 1 月 1 日 00:00 GMT
  • 添加了第二个使用 UTC 时间的示例。
  • 我忘了Date.UTC()。非常聪明。因此,对我来说是最好的解决方案。
  • 不使用 Date.UTC 将导致时区特定的持续时间。所以第一个例子很容易出错。
  • 用澄清的评论更新了答案。
【解决方案2】:
var ms = +new Date() - new Date( '2012/01/01' )

如果需要,也可以创建第二个日期对象new Date( '2012/01/01 GMT' )

【讨论】:

  • ?那是您自 2012 年 1 月 1 日以来的女士。用它做任何你想做的事
  • 谢谢。正是我想要的
  • 该日期格式不是符合 ECMAScript Edition 5.1 的实现必须识别的格式。必须识别的格式是 ISO 8601 中指定的扩展格式(参见第 15.9.1.15 节)。此外,作为 ECMAScript 的一项功能,- 运算符将其所有操作数转换为 Number(第 11.6.2 节),因此不需要使用一元 + 进行显式转换:var ms = new Date() - new Date("2012-01-01T00:00:00.000Z");
  • 您必须使用 UTC,否则持续时间是特定于时区的。
  • @PointedEars -- ECMAScript 的每个实现都可以识别YYYY/MM/DD,写出完整的格式是没有意义的。我会尽快写( YYYY, MM, DD ),就像 matsev 的回答一样。 @TJR——因此是第二行
【解决方案3】:

这是一个例子:

示例输出。注意DurationGMTDurationLocal 的不同之处。在与日期进行比较时总是使用 GMT。

Now:         1,326,054,979,124 ms (Sun, 08 Jan 2012 20:36:19 GMT)

Start1:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
Start2:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
Start3:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
DurationGMT: 678,979,124 ms (Accurate method)

StartLocal1:   1,325,397,600,000 ms (Sun, 01 Jan 2012 06:00:00 GMT)
DurationLocal: 657,379,124 ms !!! Don't use this method

这里有三种获取 GMT 日期的方法,#3 就是你想要的。

var now = new Date();
var startOfYear1 = createGMTDate1(2012, 0, 1, 0, 0, 0, 0);
var startOfYear2 = createGMTDate2(2012, 0, 1, 0, 0, 0, 0);
var startOfYear3 = createGMTDate3(2012, 0, 1, 0, 0, 0, 0);
var durationGMTMillis = now.getTime() - startOfYear1.getTime(); // accurate

var startOfYearLocal1 = new Date(2012, 0, 1, 0, 0, 0, 0);
var durationLocalMillis = now.getTime() - startOfYearLocal1.getTime(); // inaccurate

function createGMTDate1(year, month, date, hours, mins, secs, millis) {
  var dateDefaultTz = new Date(year, month, date, hours, mins, secs, millis);
  var localeTzGMTMillis = dateDefaultTz.getTime();
  var localeTzGMTOffsetMillis = dateDefaultTz.getTimezoneOffset() * 60 * 1000;
  var dateGMT = new Date(localeTzGMTMillis - localeTzGMTOffsetMillis);
  return dateGMT;
}

function createGMTDate2(year, month, date, hours, mins, secs, millis) {
  var dateGMT = new Date(0);
  dateGMT.setUTCFullYear(year);
  dateGMT.setUTCMonth(month);
  dateGMT.setUTCDate(date);
  dateGMT.setUTCHours(hours);
  dateGMT.setUTCMinutes(mins);
  dateGMT.setUTCSeconds(secs);
  dateGMT.setUTCMilliseconds(millis);
  return dateGMT;
}

function createGMTDate3(year, month, date, hours, mins, secs, millis) {
  var dateGMT = new Date(Date.UTC(year, month, date, hours, mins, secs, millis));
  return dateGMT;
}

【讨论】:

  • createGMTDate1() 看起来是假的。 createGMTDate2() 调用过多。
  • @PointedEars,它看起来是假的,还是你测试过但它失败了?查看执行js的链接。
  • 尝试创建具有特定时间值的Date 实例与计算时间值之间的差异。
  • @PointedEars,你甚至读过答案吗? var durationMillis = now.getTime() - startOfYear1.getTime();
  • 正如我所怀疑的,createGMTDate1() 在 DST 切换期间失败。这是一个常见的错误。 createGMTDate1() 返回“Sun Mar 27 2011 03:00:00 GMT+0200 (CEST)”,而 Date.UTC() 在传递相同的参数时返回“Sun Mar 27 2011 04:00:00 GMT+0200”的时间值( CEST)”在 Chromium 16.0.912.63(开发人员内部版本 113337 Linux)中。 Testcase
【解决方案4】:

正如其他人所说,解决方案是减去Date 实例:

var ms = now - before;

这是因为- 运算符将其操作数转换为NumberECMAScript Language Specification, Edition 5.1,第 11.6.2 节)。对应的ToNumber 算法检查对象是否具有valueOf 方法,如果存在则调用它(第 9.3、9.1 和 8.12.8 节)。

现在,Date 实例继承的 Date.prototype.valueOf() 方法对于给定的 Date 实例返回与 Date.prototype.getTime() 相同的值(第 15.9.5.8 节)。这是自 1970 年 1 月 1 日 (CE) 00:00:00.000 UTC(“纪元”)(第 15.9.1.1 节)以来的毫秒数。

如果要与本地时间进行比较,第一个操作数很明显:

var now = new Date();

第二部分有点棘手,因为您想从 2012 年 1 月 1 日 (CE) 00:00:00.000 GMT 开始计算。为此,您不能使用

var before = new Date(2012, 0, 1);

(或其变体),因为它使用 00:00:00.000 本地时间(第 15.9.3.1 节)。至少有两种方法可以完成这项工作:

  1. 使用日期格式的字符串值,该值必须由 ECMAScript 版本 5.1(第 15.9.1.15 节)的一致实现识别:

    var ms = new Date() - new Date("2012-01-01T00:00:00.000Z");
    
  2. 如果您担心向后兼容性,可以明确设置时间(第 15.9.5 节):

    var before = new Date();
    before.setUTCFullYear(2012, 0, 1);
    before.setUTCHours(0, 0, 0, 0);
    
    var ms = now - before;
    

【讨论】:

  • 您必须使用 UTC,否则持续时间是特定于时区的。
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2013-05-26
  • 2010-12-29
  • 2017-08-05
相关资源
最近更新 更多