本节内容:
简介
虽然有些应用目标市场只是在一个时区,有些应用目标市场是许多不同时区,为满足这种需求并集中化日期操作,ABP为日期操作提供公共基础。
时钟
Clock是与DateTime值合作的主要对象,它定义了以下静态属性/方法:
- Now:通过当前供应器获取当前时间。
- Kind:获取当前供应器的DateTimeKind。
- SupportsMultipleTimezone:获取一个值,指示当前供应器能否支持多时区应用。
- Normalize:把给定的DateTime标准化/转换成适合当前供应器。
所以,我们用抽象了Colok.Now的DateTime.Now代替DateTime.Now:
DateTime now = Clock.Now;
Clock内部使用了时钟供应器。有三种内置的时钟供应器:
- ClockProviders.Unspecified(UnspecifiedClockProvider):默认的时钟供应器,行为就像DateTime.Now。它使你完全不用Clock类。
- ClockProviders.Utc(UtnClockProvideder):用UTC时间,Clock.Now为DateTime.UtcNow。Normalize(标准化)方法把给定的时间转换成utc时间,并设它的Kind(种类)为DateTimeKind.Local。
- ClockProviders.Local(LocalClockProvider):用计算机的本地时间,Normailize方法把给定的时间转换成当地时间,并设置它的种类为DateTimeKind.UTC。它支持多时区。
你可设置Clock.Provider,以便使用一个不同的时钟供应器:
Clock.Provider = ClockProviders.Utc;
这是在应用程序开始前(在Web应用里就是Application_Start)通常的做法。
客户端
通过javascript的abp.clock对象在客户端使用时钟,当你在服务端设置Clock.Provider时,ABP会自动在客户端设置abp.clock.provider的值。
时区
ABP定义了一个名为Abp.Timing.TimeZone设置(TimingSettingNames.TimeZone常量),来存储被选的宿主时区。ABP假设时区设置的值是一个可用的Windows时区id。同样定义了一个时区映射文件把一个Windows时区转换成IANA(互联网数字分配机构)时区,因为有些公共库使用的是IANA时区id。为支持多时区必须使用UtcClockProvider。如果使用UtcClockProvider,所有的日期值将存储为UTC,并用UTC的格式发送给客户端,然后我们可以在客户端通过用户当前时区的设置把UTC日期转换成用户的时区。
客户端
ABP创建一个Javascript对象,名为abp.timing.timeZoneInfo,为当前用户包含时区信息。该信息包含Windows和IANA时区id和一些windows时区额外信息。这些信息可用用户的时区转换和显示给用户。
绑定器和转换器
- 在MVC、Web Api和Asp.new Core项目里,ABP自动把接收到的日期按当前时钟供应器标准化。
- 当使用EntityFramework或NHibernate模块时,ABP自动把接收自数据库的日期按当前时钟供应器标准化。
如果使用UTC时钟供应器,所有的存储在数据库中的日期都认为是UTC值,和所有接收自客户端的日期都认为是UTC,除了显式指明。