0

示例场景:

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

我怎么能引起:

DateTime.Now

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

4

2 回答 2

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重载。sourceTimeZone时区是从DateTime.Kind源日期的属性中计算出来的(在你的情况下,DateTime.Now无论如何都会暗示本地)。

于 2012-11-19T09:10:39.533 回答
1

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

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

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

var nowWithZone = DateTimeOffset.Now;

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

您可以使用、和DateTime等属性转换为普通格式。nowWithZone.LocalDateTimenowWithZone.UtcDateTimenowWithZone.DateTime

最后,如果这对您的需求来说太混乱或太简单,则可以使用Noda time

于 2012-11-19T11:39:50.540 回答