Jon*_*han 1 javascript timezone mongodb
我正在努力找出javascript中时区的因素开始.考虑以下:
var raw_time = new Date(this.created_at);
var offset_time = new Date(raw_hour.getTime() + time_zone_offset_in_ms);
// This resets timezone to server timezone
var offset_day = new Date(offset_time.setHours(0,0,0,0))
// always returns 2011-12-08 05:00:00 UTC, no matter what the offset was!
// This has the same issue:
var another_approach_offset_day = new Date(offset_time.getFullYear(),offset_time.getMonth(),offset_time.getHours())
Run Code Online (Sandbox Code Playgroud)
我希望当我通过太平洋时区偏移时,得到:2011-12-08 08:00:00 UTC等等.
实现这一目标的正确方法是什么?
我认为问题的一部分是setHours方法根据当地时间设置小时(从0到23).
另请注意,我使用嵌入在mongo中的javascript,因此我无法使用任何其他库.
谢谢!
Jeez,所以这对我来说真的很难,但这是我提出以下解决方案的最终解决方案.诀窍是我需要使用setHours或SetUTCHours来获得一天的开始 - 我唯一的选择是系统时间和UTC.所以我得到UTC日的开始,然后加上偏移!
// Goal is given a time and a timezone, find the beginning of day
function(timestamp,selected_timezone_offset) {
var raw_time = new Date(timestamp)
var offset_time = new Date(raw_time.getTime() + selected_timezone_offset);
offset_time.setUTCHours(0,0,0,0);
var beginning_of_day = new Date(offset_time.getTime() - selected_timezone_offset);
return beginning_of_day;
}
Run Code Online (Sandbox Code Playgroud)
在JavaScript中,所有日期都存储为UTC.也就是说,返回的序列号date.valueOf()是自1970-01-01 00:00:00 UTC以来的毫秒数.但是,当您通过.toString()或.getHours()等检查日期时,您将获得当地时间的值.也就是说,系统运行脚本的本地时间.您可以使用.toUTCString()或.getUTCHours()等等方法获取UTC中的值.
所以,你不能在任意时区得到一个日期,它都是UTC(或本地).但是,当然,如果您知道UTC偏移,您可以在任何您喜欢的时区获得日期的字符串表示.最简单的方法是从日期和通话中减去UTC偏移量,.getUTCHours()或者根据需要减去.toUTCString():
var d = new Date();
d.setMinutes(d.getMinutes() - 480); // get pacific standard time
d.toUTCString(); // returns "Fri, 9 Dec 2011 12:56:53 UTC"
Run Code Online (Sandbox Code Playgroud)
当然,如果你使用的话,最后你需要忽略"UTC" .toUTCString().你可以去:
d.toUTCString().replace(/UTC$/, "PST");
Run Code Online (Sandbox Code Playgroud)
编辑:不要担心时区何时重叠日期边界.如果您传递setHours()一个负数,它将从昨天的午夜减去这些小时数.例如:
var d = new Date(2011, 11, 10, 15); // d represents Dec 10, 2011 at 3pm local time
d.setHours(-1); // d represents Dec 9, 2011 at 11pm local time
d.setHours(-24); // d represents Dec 8, 2011 at 12am local time
d.setHours(52); // d represents Dec 10, 2011 at 4am local time
Run Code Online (Sandbox Code Playgroud)