简短的回答:你不能。
夏令时使其不可能。例如,仅根据 UTC 偏移量,无法确定夏季亚利桑那州和加利福尼亚州之间的差异,或冬季亚利桑那州和新墨西哥州之间的差异(因为亚利桑那州不遵守 DST)。
还有不同国家遵守夏令时的时间问题。例如,美国的 DST 比欧洲更早开始并更晚结束。
可以进行近似猜测(即+/-一小时),但如果您使用它向用户显示时间,您将不可避免地向其中一些人显示错误的时间。
Update:从评论来看,您的主要目标似乎是显示用户本地时区的时间戳。如果这就是您想要做的,您应该将时间作为 UTC 时间戳发送,然后使用 Javascript 在用户的浏览器上重写它。如果他们没有启用 Javascript,他们仍然会看到可用的 UTC 时间戳。这是我想出的一个函数这个问题 https://stackoverflow.com/questions/1214234/javascript-date-parsing-bug-fails-for-dates-in-june,我用过这个油猴脚本 https://meta.stackexchange.com/questions/12635/greasemonkey-script-to-display-absolute-timestamps-in-local-time。您可能需要对其进行调整以满足您的需求。
//@param timestamp An ISO-8601 timestamp in the form YYYY-MM-DDTHH:MM:SS±HH:MM
//Note: Some other valid ISO-8601 timestamps are not accepted by this function
function parseISO8601(timestamp)
{
var regex = new RegExp("^([\\d]{4})-([\\d]{2})-([\\d]{2})T([\\d]{2}):([\\d]{2}):([\\d]{2})([\\+\\-])([\\d]{2}):([\\d]{2})$");
var matches = regex.exec(timestamp);
if(matches != null)
{
var offset = parseInt(matches[8], 10) * 60 + parseInt(matches[9], 10);
if(matches[7] == "-")
offset = -offset;
return new Date(
Date.UTC(
parseInt(matches[1], 10),
parseInt(matches[2], 10) - 1,
parseInt(matches[3], 10),
parseInt(matches[4], 10),
parseInt(matches[5], 10),
parseInt(matches[6], 10)
) - offset*60*1000
);
}
return null;
}
这是我在博客上使用的一个函数,用于显示用户本地时区中已解析的时间戳。同样,您可以将其调整为您想要的格式。
var weekDays = new Array("Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday");
var months = new Array("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December");
function toLocalTime(date)
{
var hour = date.getHours();
var ampm = (hour < 12 ? "am" : "pm");
hour = (hour + 11)%12 + 1;
var minutes = date.getMinutes();
if(minutes < 10)
minutes = "0" + minutes;
return weekDays[date.getDay()] + ", "
+ months[date.getMonth()] + " "
+ date.getDate() + ", "
+ date.getFullYear() + " at "
+ hour + ":"
+ minutes + " "
+ ampm;
}