示例场景:
我的时区服务器为+13.00(例如),我的用户在时区+2.00工作。
我该如何导致:
DateTime.Now
在服务器上调用返回UTC +2.00的时间? (或将DateTime.Now结果转换为+2.00时区)
答案 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;
您可以使用DateTimeOffset
和nowWithZone.ToLocalTime()
等方法转换为其他nowWithZone.ToOffset(TimeSpan.FromHours(+2.0))
。
您可以使用DateTime
,nowWithZone.LocalDateTime
和nowWithZone.UtcDateTime
等属性转换为普通nowWithZone.DateTime
。
最后,如果这太困惑或太简单,无法满足您的需求,可以使用Noda time。