我如何将UTC日期转换为我的时区?

时间:2011-03-09 07:43:06

标签: c# asp.net

我需要在我的网络应用程序中将时间转换为“UTC + 03:30时区”这里是UTC日期:

DateTime dt = DateTime.UtcNow;

是否有将UTC转换为我的时区的功能?如果ASP.NET中有一个函数,我不想让自己在我的应用程序中编写新函数。

应用程序可能托管在世界上不同的服务器上,这正是我使用UTC日期的原因。

我需要一个函数将3:30加到当前的UTC时间。

2 个答案:

答案 0 :(得分:7)

你确定你的时区真的 UTC +3:30,一直没有夏令时吗?如果是这样,您可以使用适当的偏移(3.5小时)创建DateTimeOffset。例如:

DateTimeOffset dtOffset = new DateTimeOffset(DateTime.UtcNow,
                                             TimeSpan.FromHours(3.5));

当然,这会为您提供DateTimeOffset而不是DateTime ......您可以使用它吗?

更好的解决方案是使用TimeZoneInfo - 例如,您可以获得正确的时区并致电

DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tzInfo);

...或者您可以使用TimeZoneInfo但仍然可以获得DateTimeOffset

DateTimeOffset dto = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzInfo);

我个人建议您尽可能使用DateTimeOffset,因为DateTime的含义有些含糊不清且难以正确使用。

不幸的是,.NET的日期和时间处理有点混乱:(我有一个名为Noda Time的项目,如果我们完成它,它应该改善事态,但它远没有生产就绪那一刻。

答案 1 :(得分:-1)

这可以让您将UTC转换为任何时区

Shared Function FromUTC(ByVal d As Date, ByVal tz As String) As Date
 Return (TimeZoneInfo.ConvertTimeBySystemTimeZoneId(d, TimeZoneInfo.Utc.Id, tz))
end function

您可以使用

获取时区列表
For Each timeZone As TimeZoneInfo In tzCollection
   Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
Next