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

4

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

DateTime dt = DateTime.UtcNow;

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

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

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


当夏令时到来时,你会做什么? - Axarydax
我不知道,我对夏令时很困惑,有什么建议吗? - kamiar3001
我们不知道你为什么要使用那个时区,所以很难说。UTC+3:30 有什么特别之处吗? - Jon Skeet
现在是我的国家时间,但我们的服务器在加拿大。我需要这个时间来为我的客户服务,他们需要在网络应用程序中安排一些事情。 - kamiar3001
2个回答

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的项目,如果我们完成它,应该会改善现状,但目前还远未准备好投入生产。


如果需要DateTime,您可以随时再次调用dtoffset.DateTime :) DateTimeOffset的问题在于,在System.ServiceModel.Syndication之外,BCL的其他部分似乎都没有使用它(类似于几乎没有使用System.Uri,而通常期望字符串。) - Michael Stum
@Michael:没错,但我希望这只是在显示边界处 - 在这种情况下,它只需要进行格式化。不幸的是,目前我们没有足够的信息:( - Jon Skeet

-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

使用VB日期类型并不是很适合C#,对吧?此外,我不认为系统时区是OP想要使用的时区。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接