更新された回答
私の元の応答は以下のとおりであり、まだ有効です。ただし、TimeZoneNamesライブラリを使用するより簡単な方法があります。Nugetからインストールした後、次の操作を実行できます。
string tzid = theTimeZoneInfo.Id; // example: "Eastern Standard time"
string lang = CultureInfo.CurrentCulture.Name; // example: "en-US"
var abbreviations = TZNames.GetAbbreviationsForTimeZone(tzid, lang);
結果のオブジェクトは、次のようなプロパティを持ちます。
abbreviations.Generic == "ET"
abbreviations.Standard == "EST"
abbreviations.Daylight == "EDT"
この同じライブラリを使用して、タイムゾーンの完全にローカライズされた名前を取得することもできます。ライブラリは、CLDRデータの埋め込み自己完結型コピーを使用します。
元の回答
他の人が述べたように、タイムゾーンの略語はあいまいです。ただし、本当に表示用に1つが必要な場合は、IANA/Olsonタイムゾーンデータベースが必要です。
WindowsのタイムゾーンからIANA/Olsonのタイムゾーンに、またはその逆に移動することもできます。ただし、特定のWindowsゾーンには複数のIANA/Olsonゾーンが存在する可能性があることに注意してください。これらのマッピングは、ここのCLDRで維持されます。
NodaTimeにはデータベースとマッピングの両方があります。.NetDateTime
またはDateTimeOffset
を使用してTimeZoneInfo
、NodaTimeInstant
およびに移動できDateTimeZone
ます。そこから、略語名を取得できます。
// starting with a .Net TimeZoneInfo
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
// You need to resolve to a specific instant in time - a noda Instant
// For illustrative purposes, I'll start from a regular .Net UTC DateTime
var dateTime = DateTime.UtcNow;
var instant = Instant.FromDateTimeUtc(dateTime);
// note that if we really wanted to just get the current instant,
// it's better and easier to use the following:
// var instant = SystemClock.Instance.Now;
// Now let's map the Windows time zone to an IANA/Olson time zone,
// using the CLDR mappings embedded in NodaTime. This will use
// the *primary* mapping from the CLDR - that is, the ones marked
// as "territory 001".
// we need the NodaTime tzdb source. In NodaTime 1.1.0+:
var tzdbSource = TzdbDateTimeZoneSource.Default;
// in previous NodaTime releases:
// var tzdbSource = new TzdbDateTimeZoneSource("NodaTime.TimeZones.Tzdb");
// map to the appropriate IANA/Olson tzid
var tzid = tzdbSource.MapTimeZoneId(timeZoneInfo);
// get a DateTimeZone from that id
var dateTimeZone = DateTimeZoneProviders.Tzdb[tzid];
// Finally, let's figure out what the abbreviation is
// for the instant and zone we have.
// now get a ZoneInterval for the zone and the instant
var zoneInterval = dateTimeZone.GetZoneInterval(instant);
// finally, you can get the correct time zone abbreviation
var abbreviation = zoneInterval.Name;
// abbreviation will be either PST or PDT depending
// on what instant was provided
Debug.WriteLine(abbreviation);