4
最近,我在.NET中的時區感知Web應用程序中一直在討論時區。我提出了以下處理時區的解決方案。在.net中處理與時區有關的日期時間的最佳方法
我的解決辦法是:
- 有用戶配置文件存儲他們在
- 在Web服務器上的時區做所有的轉換和從UTC。
- 將日期作爲UTC存儲在數據庫中。
我的問題是:
- 你們是否認爲這是在.net中的最佳方法?
- 正在使用UTC的datetime2足夠好,或者我應該將 偏移量中的客戶端時間存儲在數據庫中(基本上10-10-2012 4:00:00與10-10-2012 00:00:00 4: 00)?另外,你們中的一些人可能會注意到,雖然跨DST的跳轉是在服務器代碼中處理的,但將偏移量傳遞到SP或類似的DB上將無法正確處理DST。對此有何想法?
下面是時間轉換的示例代碼。
private TimeZoneInfo GetTimeZoneInfo()
{
var timeZone = TimeZoneDropdown.SelectedValue;
switch (timeZone)
{
case "Eastern":
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
case "Central":
return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
case "Mountain":
return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
case "Pacific":
return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
case "Alaskan":
return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time");
}
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
}
public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone);
}
public DateTime ConvertUtcToLocalDateTime(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone);
}
有一個缺點是在數據庫中將日期時間存儲爲UTC。你如何考慮數據庫方面的DST?根據時區和DST,無法將DateTime或DateTime2轉換爲用戶本地時間。如果你通過一個偏移量,那麼你可能仍然會因爲有一天在DST中而另一個不在。示例3/10/2012 2:00:00美國東部標準時間是2012年3月9日20:00:00,但2012年3月13日2:00:00美國東部標準時間是2012年3月12日19:00:00。基本上分別是-4和-5的偏移量。那麼你傳遞給你的SP -4或-5將UTC轉換爲本地的偏移量?無論哪種方式是錯的。 – aBetterGamer
我認爲你需要提供更多關於時間如何使用的信息。如果是時間戳,那麼數據庫的本地時間戳格式(幾乎肯定)就是答案(可能是UTC)。如果只是向用戶顯示他們上次登錄的時間,那麼本地時間字符串可能是合適的。 – MZB