La hora amb ASP.NET

Quan creem aplicacions web que poden ser vistes per qualsevol persona ens entra el dubte de com gestionem les hores. La hora és diferent segons la zona que ens trobem i sempre volem mostrar al client la hora segons on ell està. Hi ha varies tècniques per saber quina és la hora del client, des de crear cookies fins a simplement demanar la zona on es troba, però com es guarda al servidor? Aquí penso que no hi ha masses opcions, per mi la millor manera és guardar la hora en Utc, d’aquesta manera, sempre pots fer la conversió d’aquesta hora a qualsevol zona que es demani.

Per fer la conversió de la hora a la zona nostra és

public static DateTime ConvertFromUtcDateTime(DateTime dateTimeUtc)
{
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dateTimeUtc, TimeZoneInfo.Utc.Id, "Romance Standard Time");
}

On Romance Standard Time és un dels valor que es troba al registre de windows per la clau HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Anuncis

Per què Dispatcher.CheckAccess no surt a Intellisense

Quan treballem amb multi-threading és molt habitual actualitzar controls d’usuari però amb Windows només el thread que crea un control pot actualitzar-lo (Thread affinity). És per això que existeix Dispatcher amb Wpf i Silverlight com a classe que representa el thread UI o thread del control si hi accedim per la propietat Dispatcher. Però quan treballem amb multi-threading necessitem comprovar si el thread que està a punt d’actualitzar el control és o no el creador del mateix. Per això tenim el CheckAccess com a mètode que comprova si el thread pot actualitzar el control o necessitem fer-ho per Dispatcher.

private delegate void AddTextDelegate(Panel p, String text);
private void AddText(Panel p, String text)
{
p.Children.Clear();
p.Children.Add(new TextBlock { Text = text });
}
private void TestBeginInvokeWithParameters(Panel p)
{
if (p.Dispatcher.CheckAccess()) AddText(p, "Added directly.");
else p.Dispatcher.BeginInvoke(
new AddTextDelegate(AddText), p, "Added by Dispatcher.");
}

Però CheckAccess no surt a Intellisense però si l’utilitzem no dóna un error de compilació. CheckAccess és un mètode amb l’atribut EditorBrowsable a Never. Microsoft diu que no és per programadors normals. Però crec que ho solucionaran ja que han rebut moltes queixes.