Ответ 1
Короткий ответ: вы не можете.
Летнее время делает невозможным. Например, нет никакого способа определить, только из UTC-коррекции, разницу между Аризоной и Калифорнией летом, или Аризону и Нью-Мексико зимой (так как Аризона не наблюдает DST).
Существует также вопрос о том, во сколько раз в разных странах наблюдается ДСТ. Например, в США DST начинается раньше и заканчивается позже, чем в Европе.
Возможно близкое предположение (т.е. +/- час), но если вы используете его для отображения времени для пользователей, вы неизбежно покажете неправильное время для некоторых из них.
Обновить. Из комментариев, похоже, ваша основная цель - отобразить временную метку в пользовательском локальном часовом поясе. Если это то, что вы хотите сделать, вы должны отправить время как временную метку UTC, а затем просто переписать его в браузере пользователя с помощью Javascript. В случае, если у них нет Javascript, они все равно будут видеть временную метку UTC. Вот функция, которую я придумал в этом вопросе, который я использовал в этой Greasemonkey script. Вы можете настроить его в соответствии с вашими потребностями.
//@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;
}