2015-03-09 5 views
-1

Mon site Web est en .net mvc. J'ai sauvegardé les dates du côté client en utilisant le calendrier jQuery dans la base de données MS SQL. J'ai également enregistré des dates en utilisant DateTime.Now. Le problème est que l'application est hébergée sur un serveur qui est en Amérique, mais mon client est au Pakistan. Ils veulent du temps selon l'heure pakistanaise.DateTime.Now provoquant des problèmes lorsque le site Web est chargé sur un serveur différent

J'ai essayé d'utiliser la classe TimeZoneInfo mais je ne peux pas l'utiliser en tant que bibliothèque de classes ou en tant que DLL. Comment puis-je utiliser une classe scellée statique et accéder à ses méthodes? Deuxièmement j'ai utilisé la culture ur-PKR dans web.config; cela me permet d'ajouter des dates au format jj/mm/aaaa qui fonctionne bien (selon le style PK). Maintenant, après avoir utilisé le style de culture ur-PK, devrais-je utiliser la classe Timezoneinfo ou non?

+0

sur le sujet: [Le cas contre DateTime. Maintenant] (http://codeofmatt.com/2013/04/25/the-case-against-datetime-now/) –

+0

Aussi - quand vous dites que vous ne pouvez pas utiliser TimeZoneInfo - êtes-vous sur .NET 3.5 ou plus grand? –

Répondre

1

Tout d'abord, vous devez séparer DateTimeen formatant à partir des fuseaux horaires. Ce sont des problèmes complètement distincts. Pour scénarios (mais pas tous), vous devez enregistrer les valeurs dans votre base de données en UTC, et les convertir dans le fuseau horaire approprié lorsque vous avez besoin de les afficher au client - c'est aussi le point où vous devrait les convertir en chaînes. (Vous devriez stocker les valeurs dans un champ DateTime ou quelque chose de similaire dans votre base de données - pasvarchar).

Pour convertir d'une valeur UTC à la zone de temps au Pakistan, vous venez d'obtenir le TimeZoneInfo avec TimeZoneInfo.FindSystemTimeZoneById puis appelez TimeZoneInfo.ConvertTimeFromUtc. Si vous avez seulement besoin du même fuseau horaire partout, vous pouvez appeler FindSystemTimeZoneById juste une fois et garder une référence à lui.

// Ignore the "standard time" part - it really is both standard and daylight where 
// necessary. 
private static readonly TimeZoneInfo PakistanZone = 
    TimeZoneInfo.FindSystemTimeZoneById("Pakistan Standard Time"); 

... 

DateTime utc = ...; // DateTime.UtcNow, or a stored value 
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, PakistanZone); 

Vous pouvez également envisager d'utiliser ma bibliothèque Noda Time, ce qui le rend plus facile de garder une trace de ce qui est local, ce qui est un instant dans le temps, etc.

+0

Je ne peux pas utiliser la classe TimeZoneInfo !! J'ai essayé d'ajouter comme référence mais ça n'ajoute rien !! que suggérez-vous ... d'autre part devrais-je enregistrer la date dans utc.now ?? –

+0

@WajahatQureshi: Vous n'ajoutez pas de * référence * à une classe. Vous venez d'ajouter une référence à un assembly et une directive using pour l'espace de noms. Mais comme c'est dans l'assemblage 'mscorlib' et dans l'espace de noms' System', vous n'avez probablement rien à faire. Et oui, vous * probablement * souhaitez stocker des horodatages en UTC, comme je l'ai dit dans mon post. –

+0

J'utilise MVC 4.5 !! –