如何在C#中两个日期之间的时区中计算出经过的总时间?

如何计算我的时区中两个DateTime / DateTimeOffset之间的实际经过时间,同时考虑夏令时,act年等?

例如,下面的代码比较2020年3月29日的00:00和05:00之间的时差,将输出6小时的时间跨度(由于夏令时,转换为本地时间后,05:00变为06:00)在我的时区开始02:00,将时钟从02:00更改为03:00)。

var timezone = TimeZoneInfo.Local;

var start = new DateTimeOffset(2020,03,29,00,timezone.BaseUtcOffset).LocalDateTime;
var end   = new DateTimeOffset(2020,05,timezone.BaseUtcOffset).LocalDateTime;

var diff1 = end.Subtract(start);
var diff2 = end - start;

Console.WriteLine(diff1); // 06:00:00
Console.WriteLine(diff2); // 06:00:00

在上面的示例中,我试图输出 4小时,因为那是从00:00到05:00之间的经过时间。

00:00 -> 01:00 (+ 1 hr)
01:00 -> 02:00 (+ 1 hr)
02:00 -> 03:00 (0)
03:00 -> 04:00 (+ 1 hr)
04:00 -> 05:00 (+ 1 hr)

= 4 hrs

我在这里显然缺少什么。我已经读过Comparisons and arithmetic operations with DateTimeOffset values,但无法理解如何进行计算。

我知道NodaTime可以实现这一目标,但是肯定有一种无需外部库就能做到这一点的方法吗?

iCMS 回答:如何在C#中两个日期之间的时区中计算出经过的总时间?

正如Panagiotis Kanavos所指出的,

所以偏移量是错误的。不再是BaseUtcOffset,而是另外一个

我找到了TimeZoneInfo.GetUtcOffset并使用了它。我想它能满足我的要求吗?时区令人困惑,但是至少我现在得到了4个小时的输出。

var timezone = TimeZoneInfo.Local;

var startTime = new DateTime(2020,03,29,00,00);
var endTime   = new DateTime(2020,05,00);

var startTimeOffset = timezone.GetUtcOffset(startTime);
var endTimeOffset   = timezone.GetUtcOffset(endTime);

var start = new DateTimeOffset(2020,startTimeOffset);
var end   = new DateTimeOffset(2020,endTimeOffset);

var diff1 = end.Subtract(start);
var diff2 = end - start;

Console.WriteLine(diff1); // 04:00:00
Console.WriteLine(diff2); // 04:00:00
,

Your answer很好,如果时区不提供偏移量(假设时区可以是任意时区),这是正确的方法。

但是,如果您仅使用 local 系统时区工作,则可以按以下方式简化代码:

var start = new DateTimeOffset(new DateTime(2020,3,DateTimeKind.Local));
var end   = new DateTimeOffset(new DateTime(2020,5,DateTimeKind.Local));
TimeSpan diff = end - start;

之所以可行,是因为将.Kind的{​​{1}}属性传递给采用单个DateTime参数的DateTimeOffset构造函数时,将对其进行评估。如果是DateTimeDateTimeKind.Local,则说明偏移量已正确设置。仅在DateTimeKind.Utc的情况下,偏移量才可能是错误的(因为即使不是这种情况,它也会采用局部偏移)。 See the remarks in the docs here.

本文链接:https://www.f2er.com/2020171.html

大家都在问