来自.NET中非本地TimeZone的DateTime实例

时间:2017-09-14 15:34:42

标签: c# .net datetime timezone

我已经创建了一些我需要测试的DateTime扩展。为了测试它们,我需要能够模拟DateTime实例表示除创建实例的本地服务器之外的各种时区。

我试过以下......

//
// Create the new date to test. It will be in the timezone of the server it was created on (EST).    
    DateTime localDate         = new DateTime(2017, 11, 14, 12, 0, 0);
//
// Get the TimeZone for another locale
    TimeZoneInfo newTimeZone   = TimeZoneInfo.FindSystemTimeZoneById("Egypt Standard Time");
//
// Convert the localDate into a DateTime instance as if created on a server located in 
// "Egypt Standard Time". - NOT WORKING
    DateTime test              = TimeZoneInfo.ConvertTime(localDate, origTimeZone);
//
// run the test
    Boolean result = test.ExtensionMethod()

但这只会导致"测试"是当地EST TZ的另一个DateTime。时间已经改变,以反映埃及的时间,但实例,在评估时......转换为#UniversalTime"例如,仍然转换为它是一个EST时区。

鉴于上一个例子我的变量" test "将包含' 2017-11-14 19:00:00'的日期时间。当我将其转换为UTC时,我正在希望得到2017-11-14 17:00:00'的结果。相反,我得到了2017-11-15 00:00:00。

是否有从本地服务器以外的时区实例化DateTime?

1 个答案:

答案 0 :(得分:1)

DateTime不包含任何时区信息。 ToUniversalTime将始终使用本地系统时区进行UTC转换。

只需在原始ToUniversalTime对象上调用localDate即可获得您正在寻找的价值。在EST运行的机器上'2017-11-14 12:00:00'将转换为'2017-11-14 17:00:00'(+5小时)。

您可能还想查看使用DateTimeOffset类,它允许您包含偏移值以及日期/时间。这允许像ToUniversalTime这样的操作知道偏移并相应地执行转换,而不是假设本地时区偏移。

使用DateTimeOffset的示例:

TimeZoneInfo origTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset localDate = new DateTimeOffset(2017, 11, 14, 12, 0, 0, origTimeZone.BaseUtcOffset);

Console.WriteLine(localDate); // 2017-11-14 12:00:00 (EST)

TimeZoneInfo newTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Egypt Standard Time");
DateTimeOffset test = TimeZoneInfo.ConvertTime(localDate, newTimeZone);

Console.WriteLine(test); // 2017-11-14 19:00:00 (EGST)
Console.WriteLine(test.ToUniversalTime()); // 2017-11-14 17:00:00 (UTC)

输出:

11/14/2017 12:00:00 PM -05:00
11/14/2017 7:00:00 PM +02:00
11/14/2017 5:00:00 PM +00:00