定时
介绍
一些应用只针对一个时区,而其他的一些已用则有许多不同的时区。为了满足这样的需求和集中的时间操作,Abp提供了时间操作的通用基础设施。
时钟
Clocks是用来操作DateTime值的主要方法。它定义了如下的惊呆属性/方法:
- Now:根据当前的提供者获取当前时间。
- Kind:获取当前提供者的DateTimeKind。
- SupportsMultipleTimezone:获取一个值,指示当前提供者是否可以用于多时区的应用。
- Normalize:基于当前提供者标准化/转换给定的时间。
所以,取代使用DateTime.Now,我们使用Clock.Now,实现对时间的抽象:
DateTime now = Clock.Now;
Clock内部使用时钟提供者。有三种类型的内置时钟提供者:
- ClockProviders.Unspecified(UnspecifiedClockProvider):这是默认的时钟提供者,与DateTime.Now功能相同。使用它与不使用没有分别。
- ClockProviders.Utc(UtcClockProvider):使用UTC时间。Clock.Now等同于DateTime.UtcNow。标注化方法将指定时间转换为utc时间,且将类型设置为DateTimeKind.UTC。它支持多时区。
- ClockProviders.Local(LocalClockProvider):使用本地计算机时间。标准化方法将指定时间转换为本地时间,并将类型设置为DateTimeKind.Local。
可以设置Clock.Provider,以使用不同时钟提供者:
Clock.Provider = ClockProviders.Utc;
通常在应用一开始的地方设置。(在web应用的Application_Start方法中比较合适)。
客户端
Clock可以在客户端使用,在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创建了名为abp.timing.timeZoneInfo的javascript对象,它包含了当前用户的时区信息。这个信息包含Windows和IANA时区Ids,还有一些Windows时区的其他信息。这些信息可以用来转换客户端的时间,并按照客户端的时区显示时间。
Binders和Converters
- 在MVC、WebAPI和ASP.NET Core应用里,ABP基于当前时钟提供者,自动标准化从客户端接收的时间。
- 当使用EntityFramewok或NHibernate模块时,ABP基于当前时钟提供者,自动标准化从数据库接收的时间。
如果UTC时钟提供者被使用,所有存在数据库的时间都为UTC值,所有从客户端接收的时间都假定为UTC,除非显示指定。