サマータイムについて考える
ソフトウェア開発部の oka です。
日本にもサマータイムが導入される可能性あり。という事で調べました。
略語の意味
UTC | Coordinated Universal Time | 協定世界時 | GMTでは微妙なズレが発生するため調整した時間 |
GMT | Greenwich Mean Time | グリニッジ標準時 | UTCとほぼ同じ |
JST | Japan Central Standard Time | 日本標準時 | UTCから9時間進めた時刻 |
JDT | Japan Daylight Saving Time | 日本の夏時間 | 詳細不明 |
.NET Framework でのサマータイム
マイクロソフトの人が作成した資料がわかりやすかったので紹介します。
.NET Framework におけるタイムゾーンの取り扱い
要点は
・Windows での夏時間はタイムゾーンの変更として取り扱われる。
・DateTime 型の加減算処理を行う際は、必ず UTC を介して行う。
・DateTimeOffset 型を使う(ただし、.NET Framework 3.5 以降)。
との事。
マイクロソフトの答え
https://docs.microsoft.com/en-us/dotnet/standard/datetime/performing-arithmetic-operations
using System; public class TimeZoneAwareArithmetic { public static void Main() { const string tzName = "Central Standard Time"; DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0); TimeZoneInfo cst = TimeZoneInfo.FindSystemTimeZoneById(tzName); TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0); // Instantiate DateTimeOffset value to have correct CST offset try { DateTimeOffset centralTime1 = new DateTimeOffset(generalTime, cst.GetUtcOffset(generalTime)); // Add two and a half hours DateTimeOffset utcTime = centralTime1.ToUniversalTime(); utcTime += twoAndAHalfHours; DateTimeOffset centralTime2 = TimeZoneInfo.ConvertTime(utcTime, cst); // Display result Console.WriteLine("{0} + {1} hours = {2}", centralTime1, twoAndAHalfHours.ToString(), centralTime2); } catch (TimeZoneNotFoundException) { Console.WriteLine("Unable to retrieve Central Standard Time zone information."); } } } // The example displays the following output to the console: // 3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 5:00:00 AM -05:00
時刻を一旦UTCに変換してから時間を加減算し、再びローカルタイムに変換する必要があるらしい。
結論
とっても、大変そうです。