ごまなつ Blog

楽しく働ける世界を目指して

【C#】UnixTimeの現在時刻変換でやらかした2点

UnixTimeから現在時刻に変換して表示をしていたのですが、2点やらかしたので、そのまとめです。

変換には以下を用いました。

 private readonly static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long ToUnixTime(DateTime dateTime)
        {
            dateTime = dateTime.ToUniversalTime();
            TimeSpan elapsedTime = dateTime - UnixEpoch;
            return (long)elapsedTime.TotalSeconds;
        }
        public static string FromUnixTime(long unixTime)
        {
            return UnixEpoch.AddSeconds(unixTime).ToLocalTime().ToString("yyyy/MM/dd HH:mm");
        }

ToLocalTime()の書き忘れ

ToLocalTime()は現地時間への変換です。日本ではUTCと9時間ずれているため、変換しないと9時間ずれます。

カスタム日時形式文字列

docs.microsoft.com

DateTime.Now.ToString(””yyyy/MM/dd HH:mm:ss")のようなものです。よく使うのは、以下だと思います。

  • yyyy:4けたの年
  • yy:0埋め2けたの年
  • MM:0埋め2けたの月
  • dd:0埋め2けたの日
  • ddd:曜日の省略名
  • dddd:曜日の完全名
  • HH:0埋め2けたの時間(24時間表記)
  • hh:0埋め2けたの時間(12時間表記)
  • mm:0埋め2けたの分
  • ss:0埋め2けたの秒

現地時間に変換すると、どうしても12時間ずれました。なぜか。HHをhhと書いていました。24時間表記を期待しているのに12時間表記のため、午後に操作すると12時間ずれていました。また、日にちの部分にmmと書いてしまいました。

まとめ

UnixTimeは間違っていないのに、DateTimeに変換して表示するとなにかおかしい。そんなときには、現地時間への変換が行われているか、カスタム日時形式文字列は間違っていないか確認しようと思います。