1
1

AWS Lambdaで日本時間を扱う

Posted at

AWS Lambdaの関数内で、日本時間をUNIX時間に変換する処理を実装した時に、9時間足されたUNIX時間に変換されてしまいました。
コードは下記の感じ。

if (DateTimeOffset.TryParse(input, out DateTimeOffset dateTimeOffset))
{
    DateTime dateTime = dateTimeOffset.DateTime;

    long unixTimestamp = ((DateTimeOffset)dateTime).ToUnixTimeSeconds();
    return unixTimestamp.ToString();
}
else
{
    return string.Empty;
}

inputに日本時間(フォーマット:2024-01-01T00:00:00+09:00)の文字列が入ります。
上にコードを示しましたが、このコードには特に問題はありません。

解決方法

Lambdaの環境変数を追加する。

  • キー:TZ
  • 値:Asia/Tokyo

AWS Lambdaのコンソール画面で設定できる。
スクリーンショット 2024-02-04 121948.png

AWS Toolkit for Visual Studioを使ってLambda関数をアップロードする場合、アップロードと同時に環境変数も設定できる。
スクリーンショット 2024-02-04 122850.png

Lambda関数を実行する環境が、世界標準時になっているから、環境変数で日本時間に変えてあげればよいということです。

解決するまでの試行錯誤

色々試行錯誤した結果を記録として残しておきます。
いい勉強にもなったので…

なぜか血迷ってDateTime型に変換するところでタイムゾーンをLocalに設定した

修正前↓

DateTime dateTime = dateTimeOffset.DateTime;

修正後↓

DateTime dateTime = TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.Local);

Lambda関数を動かしている環境がUTCなので、意味ないですね…(^_^;)

さらに血迷ってDateTime型に変換するところでタイムゾーンをUtcに設定した

上記の修正をさらに、

DateTime dateTime = TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.Utc);

とした。
Lambda関数を動かしている環境がUTCなので(ry

タイムゾーンを日本時間に設定した(しようとした)

タイムゾーンを示すIDを指定することで、入力された日時を日本時間として読んでもらうようにしました。

DateTime dateTime =
    TimeZoneInfo.ConvertTimeToUtc(result.DateTime, TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"));

手元での動作確認は問題なく、これでいけるだろ!っと思ったのですが、アップロードして動かしたらこんなエラーが…

The time zone ID 'Tokyo Standard Time' was not found on the local computer.

ちょっと調べてると、.Net Coreにおいて、WindowsとLinuxでタイムゾーンのIDが異なるようです。
日本時間のIDは、WindowsではTokyo Standard Timeですが、LinuxではAsia/Tokyoです。
コード上でAsia/Tokyoに修正すれば正しく動いたと思うのですが、テストコードも用意していたこともあり、環境変数を設定する方法に落ち着きました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1