サマータイムについて考える

ソフトウェア開発部の 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に変換してから時間を加減算し、再びローカルタイムに変換する必要があるらしい。

結論

とっても、大変そうです。