我有一个网站,托管在不同的时区,而不是用户使用的应用程序。除此之外,用户还可以使用特定的时区。我想知道其他SO用户和应用程序是如何做到这一点的?最明显的部分是,在数据库中,日期/时间存储在UTC中。在服务器上时,所有日期/时间都应使用UTC处理。然而,我看到了三个我试图克服的问题:
以协调世界时为单位获取当前时间的
DateTime.UtcNow
).可轻松解决
DateTime
上有一个自定义的扩展方法(见下文)。主要的缺点是在视图中使用datetime的每个位置都必须调用扩展方法!这也会增加使用像JsonResult
这样的东西的难度。您不能再轻松地调用Json(myEnumerable)
,它必须是Json(myEnumerable.Select(transformAllDates))
。也许AutoMapper可以在这种情况下提供帮助?
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 and Local->UTC的过程。正如@Max Zerbini指出的那样,将UTC->本地代码放在视图中显然是明智的,但使用DateTimeExtensions
真的是答案吗?当从用户获取输入时,接受日期作为用户的本地时间(因为这是JS将使用的),然后使用ModelBinder
将其转换为UTC,这有意义吗?用户的时区存储在数据库中,很容易检索。
https://stackoverflow.com/questions/7577389
复制相似问题