相关疑难解决方法(0)

DateTime与DateTimeOffset

目前,我们有一种以TimeZone感知方式处理.net DateTimes的标准方法:每当我们生成一个DateTimeUTC时(例如使用DateTime.UtcNow),每当我们显示一个时,我们就会从UTC转换回用户的本地时间.

这工作正常,但我一直在阅读DateTimeOffset它如何捕获对象本身的本地和UTC时间.所以问题是,使用DateTimeOffsetvs我们已经做的事情有什么好处?

.net c# timezone datetime datetimeoffset

669
推荐指数
10
解决办法
19万
查看次数

如何优雅地处理时区

我的网站托管在与使用该应用程序的用户不同的时区.除此之外,用户还可以拥有特定的时区.我想知道其他SO用户和应用程序如何处理这个问题?最明显的部分是在DB内部,日期/时间以UTC格式存储.在服务器上时,所有日期/时间都应以UTC格式处理.但是,我看到了我要克服的三个问题:

  1. 以UTC格式获取当前时间(轻松解决DateTime.UtcNow).

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

    这也会增加使用类似的东西的难度JsonResult.你不能再轻易打电话了Json(myEnumerable),它必须是Json(myEnumerable.Select(transformAllDates)).也许AutoMapper可以在这种情况下提供帮助?

  3. 从用户获取输入(本地到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑到很多应用程序现在都是基于云的,服务器的本地时间可能与预期的时区差别很大,我认为处理时区会是如此常见.

以前优雅地解决了吗?有什么我想念的吗?非常感谢您的想法和想法.

编辑:为了清除一些混乱,我想添加更多细节.现在的问题不是如何在数据库中存储UTC时间,而是更多关于从UTC-> Local和Local-> UTC的过程.正如@Max Zerbini所指出的那样,将UTC-> Local代码放在视图中显然很聪明,但是DateTimeExtensions真的使用了答案吗?当从用户那里获得输入时,接受日期作为用户的本地时间(因为这是JS将使用的)然后使用a ModelBinder转换为UTC是否有意义?用户的时区存储在数据库中,可以轻松检索.

.net c# asp.net-mvc timezone asp.net-mvc-3

135
推荐指数
4
解决办法
6万
查看次数