Jam*_*mes 11 c# timezone datetime utc
我将数据库中的日期/时间存储为UTC,并根据特定时区将其在我的应用程序中计算回本地时间.比方说我有以下日期/时间:
01/04/2010 00:00
比如说它是一个国家,例如英国,它遵守DST(夏令时),在这个特定的时间,我们在夏令时.当我将此日期转换为UTC并将其存储在数据库中时,它实际存储为:
31/03/2010 23:00
由于日期将调整为夏令时的-1小时.当您在提交时观察DST时,此工作正常.但是,当时钟调整回来时会发生什么?当我从数据库中提取该日期并将其转换为本地时间时,特定日期时间将被视为31/03/2009 23:00实际上它被处理为01/04/2010 00:00.
如果我错了,请纠正我但是在存储UTC时间时这不是一个缺陷吗?
时区转换的示例
基本上我正在做的是存储信息提交到我的系统的日期/时间,以便允许用户进行范围报告.这是我存储日期/时间的方式:
public DateTime LocalDateTime(string timeZoneId)
{
var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi).ToUniversalTime().ToLocalTime();
}
Run Code Online (Sandbox Code Playgroud)
存储为UTC:
var localDateTime = LocalDateTime("AUS Eastern Standard Time");
WriteToDB(localDateTime.ToUniversalTime());
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 32
您不会根据您当前是否正在观察它们来调整DST更改的日期- 您可以根据在您描述的瞬间是否观察到DST来调整它.因此,在1月份的情况下,您不会应用调整.
这里是一个问题,但是-一些地方的时间不明确.例如,2010年10月31日凌晨1:30在英国可以代表UTC 01:30或UTC 02:30,因为时钟从早上2点回到凌晨1点.您可以从UTC中表示的任何时刻到当时将显示的当地时间,但操作不可逆.
同样地,你很可能有一个从未发生过的当地时间 - 例如,2010年3月28日凌晨1:30在英国没有发生 - 因为凌晨1点,时钟跳到凌晨2点.
它的长短是因为如果你想要及时表示,你可以使用UTC并获得明确的表示.如果您尝试在特定时区中表示时间,则需要时区本身(例如欧洲/伦敦)以及当前的UTC表示或本地日期和时间以及该特定时间的偏移量(消除DST过渡的歧义).另一种方法是仅存储UTC及其偏移量; 这允许你告诉当时的当地时间,但这意味着你无法预测一分钟之后的当地时间,因为你真的不知道时区.(DateTimeOffset基本上这就是商店.)
我们希望在Noda Time中使这个相当容易处理,但你仍然需要意识到这是一种可能性.
编辑:
您显示的代码不正确.这就是原因.我已经改变了代码的结构,使其更容易看到,但你会看到它正在执行相同的调用.
var tzi = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
var aussieTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
var serverLocalTime = aussieTime.ToLocalTime();
var utcTime = serverLocalTime.ToUniversalTime();
Run Code Online (Sandbox Code Playgroud)
那么,让我们现在考虑一下 - 当地时间是13:38(UTC + 1,在伦敦),12:38 UTC,22:39在悉尼.
您的代码将给出:
aussieTime = 22:39 (correct)
serverLocalTime = 23:39 (*not* correct)
utcTime = 22:39 (*not* correct)
Run Code Online (Sandbox Code Playgroud)
你应该不会调用ToLocalTime上的结果TimeZoneInfo.ConvertTimeFromUtc-它会假设它被称为在UTC DateTime(除非它实际上得到DateTimeKind.Local,它不会在这种情况下).
因此,如果您在这种情况下准确保存22:39,则无法准确地以UTC 格式保存当前时间.
| 归档时间: |
|
| 查看次数: |
17993 次 |
| 最近记录: |