2017-09-13 1 views
0

J'essaye de créer un système qui permet à un utilisateur de programmer un événement pour une certaine date.Comment puis-je gérer les dates d'enregistrement uniquement en tenant compte des fuseaux horaires?

Sur le serveur, j'ai un travail SQL qui s'exécute tous les jours à 3h00 HNE.

Du côté client, l'utilisateur sélectionne une date dans un horodateur.

Je dois m'assurer que le travail SQL peut regarder la date à laquelle l'utilisateur enregistre et exécute une action quel que soit le jour qui se trouve dans le fuseau horaire de l'utilisateur.

J'ai essayé stocker les éléments suivants (rugueux C# pseudocode):

DateTime scheduledDateUtc = ConvertToUTC(dateEnteredByUser.Date, usersTimezone).Date; 

J'exécute alors l'événement en fonction de la comparaison suivante dans le travail SQL:

WHERE CONVERT(DATE, scheduled_date_utc) = CONVERT(DATE, GETUTCDATE()) 

Ce échoue sur certains cas de bord et certainement mal, mais je ne sais pas quelle est la bonne stratégie.

En outre, il ne me semble pas clair comment je devrais écrire des tests unitaires pour ces cas de bord.

Merci! Etes-vous sûr de vouloir convertir en UTC?

+0

Vous n'avez pas à vous soucier de fuseaux horaires. Le paramètre de fuseau horaire local de l'ordinateur s'ajustera automatiquement. L'objet DateTime est enregistré automatiquement en temps UTC sur chaque ordinateur et transféré entre le PC et la base de données en heure UTC (à condition que vous n'utilisiez pas de chaînes). Donc, aucune conversion n'est requise. – jdweng

+0

Que signifie "défaillant"? Quelle erreur génère votre code actuel? –

+1

@jdweng Cela dépend de son type de colonne dans SQL. 'DateTime' et' DateTime2' n'ont pas d'informations de fuseau horaire alors que 'DateTimeOffset' le fait. L'entrée utilisateur doit être [convertie en UTC en premier] (https://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx) lors de l'utilisation d'une colonne 'DateTime'. – Romoku

Répondre

0

Au lieu de convertir manuellement UTC j'essayer de définir comme si

DateTime scheduledDateUtc = DateTime.SpecifyKind(dateEnteredByUser.Value, DateTimeKind.Utc);

+0

Cela peut causer des problèmes si un utilisateur est proche d'un fuseau horaire plus extrême; c'est-à-dire UTC + 12 ou UTC-11. – user3722952