如何独立于托管服务器的时区处理DateTime的转换?

时间:2011-03-25 05:08:52

标签: c# datetime timezone

我有一个应用程序可能会在世界上不同的时区发生变化,仅举几例它在德国和德国的运行。英国。

现在我有一个要求,我必须解释日期时间对象,因为它们是GMT日期,然后从中获取等效的UTC日期时间。无论时区如何,都应该发生这种情况,例如,如果应用程序在德国运行,则DateTime应该被解释为GMT并在保存到服务器之前转换为UTC。我会做同样的事情也会发生DST转换。

例如:

如果我有这样的日期时间对象: var date = new Datetime(2011,03,28,01,00,00),这应该转换为等效的UTC。在这种情况下它应该是28/03/2011 01:00:00 +01:00:00,但是当我的服务器读取保存的日期时间时,它会将其视为28/03/2011 01:00:00 +02:00:00。我的UI目前在德国运行,我怀疑日期被解释为本地日期(CET)。

你能告诉我如何进行准确的转换吗?

4 个答案:

答案 0 :(得分:2)

通常被视为最佳做法
  • 将日期时间存储为UTC
  • 尽可能晚地以时区感知用户友好格式呈现此内容

因此,我建议您依赖DateTime.Now,而是考虑使用DateTime.UtcNow

如果您允许每个用户(通过“首选项/选项”面板)确定选择自己的时区,则可以使用以下方式以适当的用户友好格式呈现UTC日期:


string timeZoneInfoId = "Romance Standard Time"; // Or any valid Windows timezone id ;-)
var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfoId);

//Build a DateTimeOffset which holds the correct offset considering the user's timezone
var dto = new DateTimeOffset(TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZoneInfo), timeZoneInfo.GetUtcOffset(utcDateTime));

var formated = string.Format("{0} {1} ({2})", dto.ToString("d"), dto.ToString("T"), dto.ToString("zzz")); //Or whatever format that fits you

注意:您可以找到所有有效Windows timeZoneId here的列表。

如果您愿意为用户添加选择列表以选择其呈现时区,则可以使用TimeZoneInfo.GetSystemTimeZones()检索TimeZoneInfo列表,然后使用Id属性将每个TimeZoneInfo作为选项的值,并调用每个TimeZoneInfo的ToString()方法来呈现选项的内容。

您的选择列表将以与本机Windows相似的方式呈现:

Windows time zones

答案 1 :(得分:1)

对于查询的第一部分,您可以从DateTime对象获取UTC时间。

DateTime dt = DateTime.Now;

dt.ToUniversalTime().ToString()会给你UTC时间。

现在,如果您希望表示与本地时间相同,则需要通过javascript从客户端获取偏移量。像

这样的东西
var now = new Date();
var offset = now.getTimezoneOffset();

现在,您可以使用此偏移量通过添加或减去从此方法获得的分钟来显示客户的时间。

希望这有帮助。

答案 2 :(得分:0)

答案 3 :(得分:0)

日期+ = TimeZone.CurrentTimeZone.GetUtcOffset(日期);