首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何优雅地处理时区

如何优雅地处理时区
EN

Stack Overflow用户
提问于 2011-09-28 09:28:54
回答 7查看 67.2K关注 0票数 148

我有一个网站,托管在不同的时区,而不是用户使用的应用程序。除此之外,用户还可以使用特定的时区。我想知道其他SO用户和应用程序是如何做到这一点的?最明显的部分是,在数据库中,日期/时间存储在UTC中。在服务器上时,所有日期/时间都应使用UTC处理。然而,我看到了三个我试图克服的问题:

以协调世界时为单位获取当前时间的

  1. (使用DateTime.UtcNow).

可轻松解决

  1. 从数据库中提取日期/时间并将其显示给用户。可能会有很多调用在不同的视图上打印日期。我在想在视图和控制器之间的某个层可以解决这个问题。或者在DateTime上有一个自定义的扩展方法(见下文)。主要的缺点是在视图中使用datetime的每个位置都必须调用扩展方法!

这也会增加使用像JsonResult这样的东西的难度。您不能再轻松地调用Json(myEnumerable),它必须是Json(myEnumerable.Select(transformAllDates))。也许AutoMapper可以在这种情况下提供帮助?

  1. 从用户获取输入(本地到协调世界时)。例如,POSTing一个带有日期的表单需要将日期转换为UTC之前。首先想到的是创建一个自定义的ModelBinder.

下面是我想在视图中使用的扩展:

代码语言:javascript
复制
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,这有意义吗?用户的时区存储在数据库中,很容易检索。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7577389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档