示例场景:
我在 +13.00 时区有一台服务器(例如),我的用户在 +2.00 时区工作。
我怎么能引起:
DateTime.Now
在服务器上调用以返回 UTC +2.00 的时间?(或将 DateTime.Now 结果转换为 +2.00 时区)
示例场景:
我在 +13.00 时区有一台服务器(例如),我的用户在 +2.00 时区工作。
我怎么能引起:
DateTime.Now
在服务器上调用以返回 UTC +2.00 的时间?(或将 DateTime.Now 结果转换为 +2.00 时区)
您将使用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
无论如何都会暗示本地)。
普通DateTime
的本身并不包含有关时区的信息。Kind
(如果知道它是当地时间还是世界时间,它确实包含一个提示。)
考虑在服务器和用户之间的通信中使用 UTC 时间的可能性。发送前使用.ToUniversalTime()
,接收后使用.ToLocalTime()
。请注意,如果您对DateTime
值执行算术运算,则Kind
可能不会被保存,并且存在.ToLocalTime()
多次意外执行等的风险。
也有可能改为使用DateTimeOffset
。它包含时区以及日期和时间。
var nowWithZone = DateTimeOffset.Now;
您可以使用和等DateTimeOffset
方法转换为其他。nowWithZone.ToLocalTime()
nowWithZone.ToOffset(TimeSpan.FromHours(+2.0))
您可以使用、和DateTime
等属性转换为普通格式。nowWithZone.LocalDateTime
nowWithZone.UtcDateTime
nowWithZone.DateTime
最后,如果这对您的需求来说太混乱或太简单,则可以使用Noda time。