如何优雅地处理时区
我的网站所在的时区与使用该应用程序的用户所在的时区不同。除此之外,用户可以具有特定的时区。我想知道其他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 …