将DateTime.Now从一个UTC时区转换为另一个

时间:2012-11-19 09:07:01

标签: .net

示例场景:

我的时区服务器为+13.00(例如),我的用户在时区+2.00工作。

我该如何导致:

DateTime.Now

在服务器上调用返回UTC +2.00的时间? (或将DateTime.Now结果转换为+2.00时区)

2 个答案:

答案 0 :(得分:2)

您可以使用TimeZoneInfo.ConvertTime方法。这允许您传入要转换的DateTime和源/目的地时区。

使用示例:

var localTime = DateTime.Now;
try
{
   Console.WriteLine("Local time: {0}", localTime);
   TimeZoneInfo destTz = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
   var pacificTime = TimeZoneInfo.ConvertTime(localTime, TimeZoneInfo.Local, destTz);
   Console.WriteLine("Pacific time: {0}", pacificTime);
}
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The registry does not define the Pacific Standard Time zone.");
}                           
catch (InvalidTimeZoneException)
{
    Console.WriteLine("Registry data on the Pacific Standard Time zone has been corrupted.");
}

如果您总是转换本地时区(即您没有明确说明从X时区转换为Y),那么您可以使用其他TimeZoneInfo.ConvertTime重载而不会{{1}参数。时区是从源日期的sourceTimeZone属性计算出来的(在您的情况下,DateTime.Kind无论如何都会暗示本地。)

答案 1 :(得分:1)

普通DateTime本身并不包含有关时区的信息。 (如果知道它是当地时间或世界时,它确实包含Kind暗示。)

考虑在服务器和用户之间的通信中使用UTC时间的可能性。在发送之前,请使用.ToUniversalTime(),并在收到后使用.ToLocalTime()。请注意,如果您对DateTime值执行算术运算,Kind可能无法保留,则可能会多次意外执行.ToLocalTime()等。

也可以使用 DateTimeOffset 。它包含时区以及日期和时间。

var nowWithZone = DateTimeOffset.Now;

您可以使用DateTimeOffsetnowWithZone.ToLocalTime()等方法转换为其他nowWithZone.ToOffset(TimeSpan.FromHours(+2.0))

您可以使用DateTimenowWithZone.LocalDateTimenowWithZone.UtcDateTime等属性转换为普通nowWithZone.DateTime

最后,如果这太困惑或太简单,无法满足您的需求,可以使用Noda time