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 Toolkit for Visual Studioを使ってLambda関数をアップロードする場合、アップロードと同時に環境変数も設定できる。
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
に修正すれば正しく動いたと思うのですが、テストコードも用意していたこともあり、環境変数を設定する方法に落ち着きました。