JavaScript日期格式和转换问题

时间:2015-01-02 20:26:16

标签: javascript date datetime

我位于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”,并在将其转换为Unix时间之前不将其转换为PST。

2 个答案:

答案 0 :(得分:3)

一些事情:

  • 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值。它未在输入中转换,当您将时间戳转换回本地时,它将被转换。

    < / LI>
  • 您可以使用moment.js之类的库,它可以让您完全控制输入和输出。这通常是最好的选择,但是在您的应用程序中包含库的开销很大。

答案 1 :(得分:0)

将指定日期字符串转换为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日午夜到指定日期的 instant 以来发生的毫秒数,与时区无关。该脚本将结果转换为Unix时间,即秒,将毫秒数除以1000。

将字符串拆分为数组后,代码会调整包含月份的元素,以免JavaScript误认为是3月的值; 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()方法也会产生相同的输出,但它会附加本地时区信息。