两个时间之间经过的小时数,不考虑国家和时区。

5

如何确定两个时间之间的小时数。例如:

旧金山时间下午3:30和迪拜时间晚上7:30

我不清楚的部分是,是否有一种通用的计算减去时间跨度的方法,考虑到时区和国家。

我使用C#作为主要语言。任何帮助都将不胜感激。

提前致谢。


1
你是否正在寻找UTC格式? - danish
请点击这里查看相关编程内容。 - PTwr
3个回答

4

您询问的是:

"旧金山下午3:30和迪拜晚上7:30"

如果您只知道时间和地点,则存在问题,因为并非所有时区都是固定实体。迪拜固定在UTC+4,但旧金山在太平洋标准时间为UTC-8,在太平洋夏令时为UTC-7。因此,还需要一个日期来进行转换。

以下内容将使用第一个时区的当前日期来计算差异:

TimeZoneInfo tz1 = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
TimeZoneInfo tz2 = TimeZoneInfo.FindSystemTimeZoneById("Arabian Standard Time");

DateTime today = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz1).Date;

DateTime dt1 = new DateTime(today.Year, today.Month, today.Day, 15, 30, 0); // 3:30 PM
DateTime dt2 = new DateTime(today.Year, today.Month, today.Day, 19, 30, 0); // 7:30 PM

TimeSpan elapsed = TimeZoneInfo.ConvertTimeToUtc(dt1, tz1) -
                   TimeZoneInfo.ConvertTimeToUtc(dt2, tz2);

(请注意,ID "Pacific Standard Time" 是美国太平洋时间的Windows时区标识符,尽管名称如此,但涵盖了PST和PDT。)
但即使如此,这也不一定是最好的方法,因为“今天”在所有时区都不同。几乎在任何时间点,全球都有两个不同的日期在运行。 这张插图来自维基百科很好地说明了这一点。

                                                        Date Animation

源时区的“当前”日期可能与目标时区当前日期不同。如果没有额外的输入,你无法做太多事情。你需要知道每个值所涉及的日期。


2

如果您使用DateTimeOffset类型,可以避免使用本地时间时的一些陷阱,因为它可以表示任何时区的本地时间:

var dateTimeOffsetSanFrancisco = DateTimeOffset.Parse("9/8/2014 3:30PM -0700");
var dateTimeOffsetDubai = DateTimeOffset.Parse("9/8/2014 7:30PM +0400");
var elapsedHours = (dateTimeOffsetDubai - dateTimeOffsetSanFrancisco).TotalHours;

1
请注意,使用.Hours并不总是会返回正确的数量:它会在超过一天的时间时“翻转”(例如,25小时将返回1)。TotalHours将为您提供实际经过的“总小时数”。 - t0yk4t
@MelanieSchmidt:哎呀,那是一个愚蠢的打字错误。现在已经修复了。谢谢。 - Martin Liversage
是的,这也是一个不错的方法 - 当您事先知道日期和偏移量时。 - Matt Johnson-Pint

0
最简单的方法是将两个DateTime对象转换为UTC时间,然后相减。
var utcSanFran = sfLocal.ToUniversalTime();
var utcDubai = dubaiLocal.ToUniversalTime();
var elapsed = dubaiLocal - sfLocal;

假设迪拜>旧金山。

要获取经过的总小时数,请使用:

elapsed.TotalHours;

请注意,这似乎只适用于本地计算机的时区。 请参阅http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx以了解更好的方法。

嗯...不行。这不是一个好的解决方案。当你调用ToUniversalTime时,它只能从运行它的机器的本地时区进行转换。由于一台计算机不能同时处于旧金山和迪拜,所以无论在哪里运行,此代码都不起作用。 - Matt Johnson-Pint
你至少可以指出正确的解决方案。http://msdn.microsoft.com/en-us/library/system.timezoneinfo(v=vs.110).aspx 应该提供 OP 所需的所有信息。 - t0yk4t
我只能打字这么快。 :) - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接