J'essaye d'écrire une fonction qui (1) fonctionnera sur une machine dans n'importe quel fuseau horaire, (2) calculera le nombre de heures entre deux dates, et (3) prendre en compte les paramètres DST pour le fuseau horaire donné ...Déterminer le nombre d'heures entre deux DateTimes dans un fuseau horaire spécifique, en prenant DST en compte
Cela semble si facile, mais je n'arrive pas à le comprendre. Je génère des horaires de travail dans d'autres fuseaux horaires. Donc, hier (6 novembre 2016) à New York, par exemple, je devrais générer 25 heures de programmes. Aujourd'hui (7 novembre 2016), je n'aurais besoin que de générer des horaires pour 24 heures. Mars prochain, il y aura une journée qui nécessite 23 heures.
Je regardais ceci étant ma signature, mais je pense que je pourrais avoir besoin d'un argument string TimeZoneId
.
public double GetScheduledHours(DateTime begin, DateTime end) {}
j'ai commencé ici:
// incorrectly outputs 24
Console.WriteLine((new DateTime(2016, 11, 7) - new DateTime(2016, 11, 6)).TotalHours);
J'ai essayé à côté, avec un succès de courte durée:
// correctly outputs 25 on a machine whose local time zone is "Eastern Standard Time"
// incorrectly outputs 24 on dotnetfiddle whose local time zone is "Coordinated Universal Time"
var ticks = (new DateTime(2016, 11, 7).ToUniversalTime().Ticks - new DateTime(2016, 11, 6).ToUniversalTime().Ticks;
Console.WriteLine(ticks/10000/1000/60/60 + " hours");
J'ai essayé d'utiliser DateTimeOffset en vain et trouvé un comportement bizarre aussi bien ...
// on a machine whose local time zone is Easter Standard Time,
// if you store the DateTime inside of a DateTimeOffset, simple subtraction works fine
var pacificTz = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
DateTime pst6thAsDateTime = pst6th.DateTime;
DateTime pst7thAsDateTime = pst7th.DateTime;
DateTimeOffset pst6thAsDateTimeOffset = pst6th.DateTime;
DateTimeOffset pst7thAsDateTimeOffset = pst7th.DateTime;
// incorrectly outputs 24
Console.WriteLine((pst7thAsDateTime - pst6thAsDateTime).TotalHours);
// correctly outputs 25
// also incorrectly outputs 24 on a machine whose local time zone is not "Eastern Standard Time"
Console.WriteLine((pst7thAsDateTimeOffset - pst6thAsDateTimeOffset).TotalHours);
Un violon avec quelques codes ... si vous exécutez ce code sur une machine dont le fuseau horaire local est "Eastern Standard Time", seulement 2 échouent.
https://dotnetfiddle.net/djZ7ME
Vous devez également garder à l'esprit à New York change l'heure d'été au 6 novembre, mais en Europe au 30 octobre. –