Pour mon site, je viens d'utiliser jQuery pour faire une requête AJAX à un fuseau horaire gestionnaire HTTP qui enregistrerait le fuseau horaire dans session, puis j'ai créé une méthode d'extension "ToVisitorTime" qui utiliserait cette valeur.
Dans votre modèle de base ou en-tête de la page:
<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>
ensuite de le cacher si vous avez déjà empoigné la session, dans le behind:
protected void Page_Load(object sender, EventArgs e)
{
object sessOffset = Session["OFFSET"];
if (sessOffset == null)
{
plcTimezoneScript.Visible = true;
}
}
Pour le gestionnaire /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;
}
}
}
Puis une méthode d'extension pour prendre soin d'afficher le bon moment (renvoie un DateTime objet pour un traitement ultérieur si nécessaire). N'oubliez pas de le stocker dans une classe statique:
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;
}
Cela a été pris d'un tutoriel, je l'ai pas encore publié mais devrait faire ce que vous avez besoin. Un inconvénient est que sur le premier chargement de la page, rien ne sera dans le bon moment.
Vous devriez probablement utiliser une méthode JS, étant donné que cela nécessite déjà que JS fonctionne. Je recommanderais le plugin Datejs et utiliserais jQuery pour remplacer automatiquement les dates utc.
Je veux faire quelque chose de similaire, mais au lieu d'utiliser la date actuelle pour obtenir le décalage (et calculer incorrectement certaines dates), j'ai besoin d'utiliser RunTime pour obtenir le décalage. Comment puis-je faire cela à partir d'un GridView? –
Vous avez dit que RunTime était une date UTC. Vous devez d'abord obtenir l'offset de la date actuelle de l'utilisateur (via JavaScript), puis ajuster RunTime avec ce nouveau décalage. .NET n'a aucun moyen de connaître les informations sur le fuseau horaire du client car tout fonctionne côté serveur. Exemple: RunTime est 15:00 UTC. JS obtient un décalage de -6 pour le client. RunTime doit soustraire 6 heures afin d'afficher l'heure dans le fuseau horaire du client (9h00). – kamranicus
Et comment compensez-vous lorsque la date est en janvier dernier? Mon décalage actuel serait de -5 pour l'heure d'été, ce qui me ferait perdre une heure de janvier. –