【问题标题】:Default time zone per user, set in the business logic每个用户的默认时区,在业务逻辑中设置
【发布时间】:2011-07-14 13:07:37
【问题描述】:

我有一个应用程序,其中所有 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

【问题讨论】:

  • 您的问题是什么,您使用什么语言/框架?
  • 问题:如何实现第二步“第二步是为用户假设一个时区(基于业务逻辑),并用作显示和解析用户输入的默认值. 此外,如果 DateTime.Now 之类的方法和其他在没有明确时区/地区信息的情况下构造日期时间的方法调用也可以假设这个时区/地区,那就太好了。”语言/框架:VB .NET 3.5

标签: datetime timezone globalization business-logic region


【解决方案1】:

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

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

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

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

如果您实施此方法,您可能会遇到时区名称的问题 - 它们属于服务器文化,因此您需要外部化(移动到资源文件)TimeZoneInfo 的DisplayName 向您展示的内容并让翻译人员完成他们的工作工作。

我所说的检测时区也只是一个简短的词。
在胖客户端上,您只需读取本地时区即可:

TimeZoneInfo currentTimeZone = TimeZoneInfo.Local;

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多