關於亞利桑那時區
從timeanddate.com:
有一種普遍的誤解,認爲亞利桑那州的夏季和山地標準時間(MST) 期間在太平洋夏令 時間(PDT)冬天。由於MST和PDT具有相同的UTC偏移量 減7小時(UTC-7),因此亞利桑那州與當地的時間相同 在夏季表示加州和內華達州。 雖然 時間是相同的,亞利桑那州使用標準時間(MST)全年。 「日光」時區,如MDT,主要用於地區是 開關DST每年
IANA(TZ數據庫)時區數據庫包含亞利桑那州兩個地時區:
- 美國/鳳凰(山地標準時間 - 亞利桑那,納瓦霍除外),這確實不觀察夏令時(DST),並
- 美國/希普羅克,它觀察DST。
亞利桑那時區在.NET
根據您的用戶在亞利桑那州的確切位置,你應該使用美國/鳳凰或美國/希普羅克時區,所以你將需要兩個值在數據庫中。但是,如果您嘗試使用TZ數據庫名,以獲取時區與TimeZoneInfo.FindSystemTimeZoneById
,你會得到System.TimeZoneNotFoundException
。
爲了得到不遵守DST(美國/鳳凰)亞利桑那州的時區,你可以使用:
TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time")
爲了獲得亞利桑那時區,做遵守DST(美國/希普羅克),你可以使用:
TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time")
所以,你將有兩個IDS在數據庫中,US Mountain Standard Time
和Mountain Standard Time
,或者一些其他字符串ŧ您稍後將映射到這些.NET時區ID。
退房NodaTime,它可以幫助你很多,當談到處理日期,時間和時區。
最後,這裏是一個演示.NET 美國山地標準時間(美國/鳳凰,亞利桑那州沒有DST)和山地標準時間(美國/之間的差異的樣本程序(帶NodaTime) Shiprock,亞利桑那州與DST)。
using System;
using NodaTime;
using NodaTime.TimeZones;
namespace TimeZoneExample
{
class Program
{
static void Main(string[] args)
{
// Arizona without daylight saving time (TZ: America/Phoenix)
var mstWithoutDstTz = TimeZoneInfo.FindSystemTimeZoneById("US Mountain Standard Time");
// Arizona with daylight saving time (TZ: America/Shiprock)
var mstWithDstTz = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
// NodaTime BclDateTimeZone for Arizona without daylight saving time
var mstWithoutDstNodaTz = BclDateTimeZone.FromTimeZoneInfo(mstWithoutDstTz);
// NodaTime BclDateTimeZone for Arizona with daylight saving time
var mstWithDstNodaTz = BclDateTimeZone.FromTimeZoneInfo(mstWithDstTz);
// January 1, 2017, 15:00, local winter date
var localWinterDate = new LocalDateTime(2017, 01, 01, 15, 00);
// NodaTime ZonedDateTime for Arizona without daylight saving time: January 1, 2017, 15:00
var winterTimeWithoutDst = mstWithoutDstNodaTz.AtStrictly(localWinterDate);
// NodaTime ZonedDateTime for Arizona with daylight saving time: January 1, 2017, 15:00
var winterTimeWithDst = mstWithDstNodaTz.AtStrictly(localWinterDate);
// Both time zones have the same time during winter
Console.WriteLine($"Winter w/o DST: {winterTimeWithoutDst}"); // 2017-01-01T15:00:00 US Mountain Standard Time (-07)
Console.WriteLine($"Winter w/ DST: {winterTimeWithDst}"); // 2017-01-01T15:00:00 Mountain Standard Time (-07)
// add 180 days to get June 30, 2017
var sixMonthsToSummer = Duration.FromTimeSpan(new TimeSpan(180, 0, 0, 0));
// During summer, e.g. on June 30, Arizona without daylight saving time is 1 hour behind.
Console.WriteLine($"Summer w/o DST: {winterTimeWithoutDst + sixMonthsToSummer}"); // 2017-06-30T15:00:00 US Mountain Standard Time (-07)
Console.WriteLine($"Summer w/ DST: {winterTimeWithDst + sixMonthsToSummer}"); // 2017-06-30T16:00:00 Mountain Standard Time (-06)
}
}
}