【问题标题】:JavaScript Date formatting and conversion issueJavaScript 日期格式和转换问题
【发布时间】:2015-01-02 20:26:16
【问题描述】:

我位于 PST 时区,我希望能够将字符串“2014-01-01”转换为 Unix 时间,而不会将“2014-01-01”转换为 PST。

这就是我正在做的事情:

Date.parse(new Date("2014-01-01"))

我得到的值 1388534400000 相当于 2013 年 12 月 31 日星期二 16:00:00 GMT-0800(太平洋标准时间)

我想将日期设为“2014-01-01”,而不是将其转换为 PST,然后再将其转换为 Unix 时间。

【问题讨论】:

  • 您真正想要的恰恰相反(将时间转换为 PST,然后再转换为 Unix 时间)。
  • @Juhana 如何将“2014-01-01”转换为 PST?
  • Date.parse(new Date("2014-01-01 PST"))(不知道它的便携性)
  • 只需使用 Momentjs 来满足您的所有约会需求。

标签: javascript date datetime


【解决方案1】:

一些事情:

  • Date 构造函数返回一个Date 对象,而不是字符串。您不应该将其包装在对 Date.parse 的调用中。

    如果您想要一个 unix 时间戳,只需调用 getTime()

    var ts = new Date("2014-01-01").getTime();
    

    或者,您可以解析日期字符串而根本不创建Date 对象。

    var ts = Date.parse("2014-01-01");
    
  • JavaScript 中日期解析的行为取决于实现。由于破折号 (-),大多数浏览器已经yyyy-mm-dd 字符串解释为 UTC。如果你用斜杠 (/) 替换,你会看到字符串被解释为本地时间。

  • 我认为您对输出感到困惑。您说时间戳等同于 PST,但这只是一种表示形式。它也等同于您传入的 UTC 值。它不会在输入中进行转换,而是在您将时间戳转换回本地时间时进行转换。

  • 您可以使用像moment.js 这样的库,它可以让您完全控制输入和输出。这通常是最好的选择,但会产生在应用程序中包含库的开销。

【讨论】:

    【解决方案2】:

    另一种将指定日期字符串转换为Unix时间的方法如下:

    var str = "2014-01-01";
    var parts   = str.split('-');
    parts[1]   -= 1;                                   // js numeric mos are 0-11
    var ms = Date.UTC( parts[0], parts[1], parts[2] ); // parts: YYYY, MM, DD
    var unix_time = ms/1000;                           // Unix time uses seconds
    console.log("Unix time: " + unix_time);
    

    Date.UTC() 返回从 1970 年 1 月 1 日午夜到指定日期的 即时 发生的毫秒数,与任何时区无关。该脚本通过将毫秒数除以 1000 将结果转换为 Unix 时间,即秒。

    将字符串拆分为数组后,代码会调整包含月份的元素,以免 JavaScript 将其值误认为是 March; JavaScript 将数字月份理解为 0-11,而不是 1-12。接下来,脚本按照 Date.UTC 所需的年、月、日参数顺序传递元素。虽然 UTC() 需要数字作为参数,但它接受数字字符串。

    注意:如果您首先创建一个新的日期对象并希望使用 UTC 方法 -- 这会导致错误,因为它是 JavaScript 日期对象的静态方法。

    您可以使用上述变量 ms 和 str 来检查 UTC() 返回值的有效性,如下所示:

    console.log( new Date( str ).toUTCString( ms ));
    

    输出:Wed, 01 Jan 2014 00:00:00 GMT

    观看现场演示here)

    将日期字符串而不是它所期望的数字参数传递给 Date 构造函数会带来意想不到的好处;日期字符串被视为其时区是 UTC,即本地日期对象为零。创建后,本地日期对象执行其 toUTCString() 方法以获得上述结果。 toString() 方法也会产生相同的输出,但它会附加本地时区信息。

    【讨论】:

      猜你喜欢
      • 2016-10-08
      • 2012-04-16
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2013-07-03
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多