每个用户的默认时区,在业务逻辑中设置

时间:2011-07-14 13:07:37

标签: datetime timezone globalization business-logic region

我有一个应用程序,其中所有DateTime始终是服务器的时间。这意味着一个时区。我们的想法是使应用程序在全世界都兼容。第一步是将数据库中所有存储的DateTime转换为UTC,这没问题。第二步是为用户假设一个时区(基于业务逻辑),并用作显示和解析用户输入的默认值。如果DateTime.Now和其他方法调用之类的方法构建没有显式时区/区域信息的日期时间也会假设这个时区/区域,那将是很好的。

我们的想法是为数据库中的用户假定一个时区。我有用户和他的时区,这没问题。
问题是表示逻辑。整个代码都有DateTime.now方法,转换所有这些方法是很多工作 为了避免这种情况,我需要一个全局时区设置,其中DateTime知道它是哪个时区。最好是在通用的地方。

class business logic 

InitializeCulture() 
 set time zone for user 
end function 

end class

class presentation logic  

sample()
 TimeOfTheCurrentUser = DateTime.now  
end function

end class

1 个答案:

答案 0 :(得分:1)

如果您正在寻找(或多或少)企业应用程序中时区处理的最佳实践,我可以分享经过验证的实践:

  1. 以UTC格式存储所有日期和时间相关信息。将它存储为本地时间(在服务器上或其他任何地方)总会带来某种风险,某些人,有朝某日忘记转换它们,结果将不太理想。当然,这意味着应该通过DateTime.UtcNow或选择正确的DateTimeKind来实例化日期和时间(这也指解析)。

  2. 显然,您需要在显示DateTime之前将时区转换为最终用户。你肯定意识到你需要从某些来源获得这些信息(因此问题)。在某个地方可能是客户端(这对于胖客户端尤其如此,瘦客户端的JavaScript不太好)但也可能与用户配置文件一样好。如果您的应用程序有用户配置文件,我肯定会建议允许用户选择首选时区。其他与g11n相关的设置将是电子邮件或首选语言的首选文化。所有这些设置都应该被检测和预选(因此用户不必考虑或更重要的是点击太多)。

  3. 要将DateTime班级转换为其他时区的本地时间,您可以使用TimeZoneInfo班级。有几种方法可以做到这一点......

  4. 如果你要实现这个方法,你可能遇到时区名称的问题 - 它们在服务器的文化中,所以你需要外化(移动到资源文件)TimeZoneInfo的DisplayName向你显示的内容并让翻译做好自己的工作。

    还可以通过检测时区快速了解我的意思 在胖客户端上,您只需阅读本地时区即可:

    TimeZoneInfo currentTimeZone = TimeZoneInfo.Local;
    

    使用JavaScript(瘦客户端)并不容易。您唯一能得到的是在给定日期的时区偏移(可能因日期和时间而异):

    var date = new Date();
    var offset = date.getTimezoneOffset(); // GMT offset in minutes