我的网站所在的时区与使用该应用程序的用户所在的时区不同。除此之外,用户可以具有特定的时区。我想知道其他SO用户和应用程序如何实现这一目标?最明显的部分是在数据库内部,日期/时间存储在UTC中。在服务器上时,所有日期/时间都应以UTC处理。但是,我看到了我要克服的三个问题:
以UTC格式获取当前时间(通过轻松解决
DateTime.UtcNow
)。从数据库中提取日期/时间并将其显示给用户。有潜在的很多人要求在不同的视图上打印日期。我在考虑视图和控制器之间的某些层可以解决此问题。或启用自定义扩展方法
DateTime
(请参见下文)。主要缺点是,在视图中使用日期时间的每个位置,都必须调用extension方法!这也会增加使用类似
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会使用的时间),然后使用a ModelBinder
转换为UTC 有意义吗?用户的时区存储在数据库中,很容易检索。
ModelBinder
。