JavaScript 日期格式和转换问题
JavaScript Date formatting and conversion issue
我位于 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。
几件事:
Date
构造函数 returns 一个 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 这样的库,它可以让您完全控制输入和输出。这通常是最佳选择,但会产生在您的应用程序中包含库的开销。
另一种将指定日期字符串转换为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() returns 从 1970 年 1 月 1 日午夜到指定日期的 瞬间 发生的毫秒数,与任何时区。该脚本通过将毫秒数除以 1000,将结果转换为 Unix 时间,即秒。
将字符串拆分成数组后,代码调整包含月份的元素,以免JavaScript将其值误认为三月; JavaScript 将数字月份理解为 0-11,而不是 1-12。接下来脚本按照Date.UTC要求的年月日参数依次传递元素。虽然 UTC() 需要数字作为参数,但它接受数字字符串。
注意:如果您首先创建一个新的日期对象并希望使用 UTC 方法——这会导致错误,因为它是 JavaScript 的日期对象的静态方法。
您可以使用上述变量 ms 和 str 检查 UTC() return 值的有效性,如下所示:
console.log( new Date( str ).toUTCString( ms ));
输出:Wed, 01 Jan 2014 00:00:00 GMT
查看现场演示 here)
将日期字符串而不是它期望的数字参数传递给 Date 构造函数会带来意想不到的好处;日期字符串被视为时区为 UTC,即本地日期对象为零。创建后,本地日期对象将执行其 toUTCString() 方法以获得上述结果。 toString() 方法也会产生相同的输出,但它附加了本地时区信息。
我位于 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。
几件事:
的调用中Date
构造函数 returns 一个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 这样的库,它可以让您完全控制输入和输出。这通常是最佳选择,但会产生在您的应用程序中包含库的开销。
另一种将指定日期字符串转换为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() returns 从 1970 年 1 月 1 日午夜到指定日期的 瞬间 发生的毫秒数,与任何时区。该脚本通过将毫秒数除以 1000,将结果转换为 Unix 时间,即秒。
将字符串拆分成数组后,代码调整包含月份的元素,以免JavaScript将其值误认为三月; JavaScript 将数字月份理解为 0-11,而不是 1-12。接下来脚本按照Date.UTC要求的年月日参数依次传递元素。虽然 UTC() 需要数字作为参数,但它接受数字字符串。
注意:如果您首先创建一个新的日期对象并希望使用 UTC 方法——这会导致错误,因为它是 JavaScript 的日期对象的静态方法。
您可以使用上述变量 ms 和 str 检查 UTC() return 值的有效性,如下所示:
console.log( new Date( str ).toUTCString( ms ));
输出:Wed, 01 Jan 2014 00:00:00 GMT
查看现场演示 here)
将日期字符串而不是它期望的数字参数传递给 Date 构造函数会带来意想不到的好处;日期字符串被视为时区为 UTC,即本地日期对象为零。创建后,本地日期对象将执行其 toUTCString() 方法以获得上述结果。 toString() 方法也会产生相同的输出,但它附加了本地时区信息。