【发布时间】:2011-11-26 12:04:52
【问题描述】:
我的网站与使用该应用程序的用户位于不同的时区。除此之外,用户可以有一个特定的时区。我想知道其他 SO 用户和应用程序如何处理这个问题?最明显的部分是在数据库内部,日期/时间以 UTC 格式存储。在服务器上时,所有日期/时间都应以 UTC 处理。但是,我看到了三个我正在努力克服的问题:
-
以 UTC 格式获取当前时间(使用
DateTime.UtcNow轻松解决)。 -
从数据库中提取日期/时间并将其显示给用户。可能有很多次调用来在不同的视图上打印日期。我正在考虑可以解决此问题的视图和控制器之间的某个层。或者在
DateTime上有一个自定义扩展方法(见下文)。主要的缺点是在视图中使用日期时间的每个位置,都必须调用扩展方法!这也会增加使用
JsonResult之类的东西的难度。你不能再轻易地打电话给Json(myEnumerable),它必须是Json(myEnumerable.Select(transformAllDates))。也许 AutoMapper 可以在这种情况下提供帮助? -
从用户那里获取输入(本地到 UTC)。例如,发布带有日期的表单需要将日期转换为 UTC 之前。首先想到的是创建一个自定义
ModelBinder。
这是我想在视图中使用的扩展:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
考虑到现在很多应用程序都是基于云的,其中服务器的本地时间可能与预期的时区大不相同,我认为处理时区将是一件很常见的事情。
这个问题以前有没有被优雅地解决过?有什么我想念的吗?非常感谢您的想法和想法。
编辑:为了消除一些混乱,我想添加更多细节。现在的问题不是 如何 在数据库中存储 UTC 时间,而是更多关于从 UTC->Local 和 Local->UTC 的过程。正如@Max Zerbini 指出的那样,将UTC->Local 代码放在视图中显然很聪明,但是使用DateTimeExtensions 真的是答案吗?从用户那里获取输入时,接受日期作为用户的本地时间(因为那是 JS 将使用的时间)然后使用 ModelBinder 转换为 UTC 是否有意义?用户的时区存储在数据库中,很容易检索。
【问题讨论】:
-
您可能首先阅读了这篇出色的帖子...Daylight saving time and Timezone best practices
-
@dodgy_coder - 这一直是时区的绝佳资源链接。但是,它并没有真正解决我的任何问题(特别是与 MVC 有关)。不过还是谢谢。
-
好奇您选择了哪种解决方案。我自己也面临着类似的决定。好问题。
-
@Sean - 迄今为止的解决方案并不优雅(这就是我尚未接受答案的原因)。打印日期/时间并使用
ModelBinder手动将其转换回需要大量手动开销。
标签: c# .net asp.net-mvc asp.net-mvc-3 timezone