我已经创建了一些我需要测试的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?
答案 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