Для моего сайта я просто использовал jQuery для выполнения AJAX-запроса к обработчику HTTP часового пояса, который будет записывать часовой пояс в сеансе, затем я создал метод расширения "ToVisitorTime", который будет использовать это значение.
В вашем базовом шаблоне или заголовке страницы:
<script type="text/javascript" src="/lib/js/jquery.js"></script>
<asp:Placeholder id="plcTimezoneScript" Visible="false" runat="server">
<script type="text/javascript">
function getVisitorTimezone()
{
// get visitor timezone offset
var curDt = new Date();
$.post("/ajax/TimezoneOffset.ashx", {
offset: -(curDt.getTimezoneOffset()/60)
});
}
$(getVisitorTimezone);
</script>
</asp:Placeholder>
Затем, чтобы скрыть это, если вы уже захватили сеанс, в коде:
protected void Page_Load(object sender, EventArgs e)
{
object sessOffset = Session["OFFSET"];
if (sessOffset == null)
{
plcTimezoneScript.Visible = true;
}
}
Для обработчика /ajax/TimezoneOffset.ashx:
using System;
using System.Web;
using System.Web.SessionState;
public class TimezoneOffset : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
object sessOffset = context.Session["OFFSET"];
if (context.Request.RequestType == "POST")
{
if (sessOffset == null)
{
string offset = context.Request.Form.Get("offset");
int Offset = 0;
if (!String.IsNullOrEmpty(offset)
&& Int32.TryParse(offset, out Offset))
{
context.Session.Add("OFFSET", Offset);
}
}
}
}
public bool IsReusable {
get {
return false;
}
}
}
Затем метод расширения, обеспечивающий отображение нужного времени (возвращает объект DateTime для дальнейшей обработки, если это необходимо). Не забудьте сохранить это в статическом классе:
public static DateTime ToVisitorTime(this DateTime UtcDate)
{
// use timezone offset, if set
object TimezoneOffset = HttpContext.Current.Session["OFFSET"];
if (TimezoneOffset != null)
{
int Offset = 0;
if (Int32.TryParse(TimezoneOffset.ToString(), out Offset))
{
UtcDate = UtcDate.AddHours(Offset);
}
else
{
UtcDate = UtcDate.ToLocalTime();
}
}
else
{
// well, at least show the local server time
UtcDate = UtcDate.ToLocalTime();
}
return UtcDate;
}
Это было взято из учебника, который я еще не опубликовал, но должен делать то, что вам нужно. Недостатком является то, что при первой загрузке страницы ничего не будет происходить в нужное время.
Вероятно, вам следует использовать метод JS, учитывая, что для этого уже требуется JS. Я бы порекомендовал плагин Datejs и использовать некоторые jQuery для автоматической замены дат utc.