Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 每个用户的默认时区,在业务逻辑中设置_Datetime_Timezone_Globalization_Business Logic_Region - Fatal编程技术网

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

Datetime 每个用户的默认时区,在业务逻辑中设置,datetime,timezone,globalization,business-logic,region,Datetime,Timezone,Globalization,Business Logic,Region,我有一个应用程序,其中所有日期时间始终是服务器的时间。这意味着只有一个时区。其目的是使应用程序在全世界兼容。第一步是将数据库中存储的所有日期时间转换为UTC,这没有问题。第二步是假设用户的时区(基于业务逻辑),并将其用作显示和解析用户输入的默认时区。此外,如果像DateTime.Now这样的方法和其他在没有明确时区/区域信息的情况下构造datetimes的方法调用也假设这个时区/区域,那就更好了 其思想是从数据库中为用户假定一个时区。我有用户和他的时区,这没问题。 问题在于表示逻辑。代码中到处都

我有一个应用程序,其中所有日期时间始终是服务器的时间。这意味着只有一个时区。其目的是使应用程序在全世界兼容。第一步是将数据库中存储的所有日期时间转换为UTC,这没有问题。第二步是假设用户的时区(基于业务逻辑),并将其用作显示和解析用户输入的默认时区。此外,如果像DateTime.Now这样的方法和其他在没有明确时区/区域信息的情况下构造datetimes的方法调用也假设这个时区/区域,那就更好了

其思想是从数据库中为用户假定一个时区。我有用户和他的时区,这没问题。
问题在于表示逻辑。代码中到处都有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

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

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

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

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

  • 如果要实现此方法,您可能会遇到时区名称的问题-它们在服务器的区域性中,因此您需要将TimeZoneInfo的
    DisplayName
    显示的内容外部化(移动到资源文件),并让翻译人员执行其工作

    还有一个简单的词,我所说的检测时区是什么意思。
    在胖客户端上,您只需读取本地时区即可:

    TimeZoneInfo currentTimeZone = TimeZoneInfo.Local;
    
    使用JavaScript(瘦客户端)并不是那么容易。唯一可以得到的是给定日期的时区偏移量(可能因日期和时间而异):

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

    您的问题是什么?您使用什么语言/框架?问题:如何实现第二步“第二步是假设用户的时区(基于业务逻辑),并用作显示和解析用户输入的默认值。此外,如果像DateTime.Now和其他在没有明确时区/区域信息的情况下构造datetimes的方法调用也将假定此时区/区域,那就更好了。”语言/框架:VB.NET 3.5相关问题: