本篇目錄
介紹###
雖然有些應用針對的是一個特定的時區,但是也有一些應用針對多個不同的時區。為了滿足這些需求,ABP為datetime操作提供了通用的基礎設施。
Clock###
Clock是用於處理 DateTime類型的主要操作類。它定義了以下靜態屬性和方法:
- Now:根據當前的provider獲取當前的時間。
- Kind:獲取當前provider的DateTimeKind。
- SupportsMultipleTimezone:獲取一個值,該值表明當前的provider可以用於需要多個時區的應用程序。
- Normalize:根據當前的provider標准化給定的DateTime。
因此,我們可以使用Clock.Now
代替DateTime.Now:DateTime now = Clock.Now;
Clock使用了三種不同類型的內置clock providers:
- ClockProviders.Unspecified:這是默認的clock provider。就像DateTime.Now一樣,它會在你沒有使用Clock類時奏效。
- ClockProviders.Utc:以UTC時間工作。Clock.Now相當於DateTime.UtcNow ,Normalize方法會將一個給定的datetime轉換成utc datetime,並將類別kind設置成DateTimeKind.UTC。它支持多時區。
- ClockProviders.Local:以本地計算機時間工作。Normalize方法會將一個給定的datetime轉換成一個本地 datetime,並將類別kind設置成DateTimeKind.Local。
要使用不同的clock provider,需要設置Clock.Provider:Clock.Provider = ClockProviders.Utc;
這通常是在應用開始的地方完成的,比如在一個web應用中是在Application_Start方法中完成的。
客戶端
在客戶端可以使用js代碼 abp.clock
對象來設置Clock。當在服務端設置了Clock.Provider時,ABP會自動在客戶端設置abp.clock.provider
的值
時區###
ABP定義了一個名為Abp.Timing.TimeZone(TimingSettingNames.TimeZone常量)的設置存儲租主、租戶和用戶選擇的時區。ABP假設時區設置值時一個有效的Windows時區Id,也定義了一個將Windows時區轉換成IANA時區的映射文件時區,因為一些公共類庫還在使用IANA時區Id。要支持多時區,必須要使用 UtcClockProvider,因為如果使用了UtcClockProvider,那么所有的datetime值都會以utc存儲,然后所有的datetime都會以UTC形式發送到客戶端。接下來客戶端就可以通過用戶當前的時區設置將UTC時間設置為用戶時區的時間。
客戶端
ABP提供了一個叫做abp.timing.timeZoneInfo
的js對象,它包含了當前用戶的時區信息,該信息包含了Windows和IANA時區Id以及一些關於windows時區的其它信息。這些信息可以用於客戶端的datetime轉換。
綁定器和轉換器###
- ABP會基於當前的clock provider自動標准化從MVC、Web API和ASP.NET Core應用的客戶端接收的DateTime值。
- 當使用了EF或者NH模塊時 ABP會基於當前的clock provider自動標准化從數據庫接收的DateTime值。
如果使用了UTC clock provider,那么存儲在數據庫中的所有DateTimes都認為是UTC值,從客戶端接收的所有DateTimes都認為是UTC值。