我有一个应用程序可能会在世界上不同的时区发生变化,仅举几例它在德国和德国的运行。英国。
现在我有一个要求,我必须解释日期时间对象,因为它们是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)。
你能告诉我如何进行准确的转换吗?
答案 0 :(得分:2)
通常被视为最佳做法
因此,我建议您不依赖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相似的方式呈现:
答案 1 :(得分:1)
对于查询的第一部分,您可以从DateTime对象获取UTC时间。
DateTime dt = DateTime.Now;
dt.ToUniversalTime().ToString()
会给你UTC时间。
现在,如果您希望表示与本地时间相同,则需要通过javascript从客户端获取偏移量。像
这样的东西var now = new Date();
var offset = now.getTimezoneOffset();
现在,您可以使用此偏移量通过添加或减去从此方法获得的分钟来显示客户的时间。
希望这有帮助。
答案 2 :(得分:0)
查看TimeZoneInfo类:http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx
答案 3 :(得分:0)
日期+ = TimeZone.CurrentTimeZone.GetUtcOffset(日期);