如何指定 container 或是 .NET application 的時區

最近經手的一個專案,使用到外部 partner 提供的 NuGet library,但這個 library 有個問題,就是 DateTime.UtcNowDateTime.Now 同時都有用到,而且沒有提供任何的設定方式,造成某些情境下的時間就會出錯而造成 bug,所以只好想辦法讓整個 container 或是 .NET application 的時區改成 UTC+0。

原本以為要改 os 設定會讓整個設定流程複雜很多,但出乎意外地簡單,加上同事也問了相同問題,所以快速紀錄一下設定方式

基本環境說明

  1. macOS Ventura 13.3
  2. OrbStack 1.0.1(16297)
  3. .NET SDK 6.0.413
  4. docker images

    • mcr.microsoft.com/dotnet/aspnet:8.0

設定方式與實際效果:透過指定 environment variable TZ 來設定時區

  1. container

    這邊我們指定為 Asia/Taipei (mcr.microsoft.com/dotnet/aspnet:8.0 預設時區為 UTC)

    • 透過 date +"%Z %z" 指令來確認
    • docker run -it --rm -e TZ=Asia/Taipei mcr.microsoft.com/dotnet/aspnet:8.0 date +"%Z %z"

    1container

  2. .NET application

    這邊我們指定為 Etc/GMT (預設使用 os 時區,我的 macbook pro 設定為 Asia/Taipei)

    • TimeZoneInfo.Local.DisplayName 可以在 .NET application 中取得目前時區
    • TZ=Etc/GMT dotnet run --project TimestampTest/TimestampTest.csproj
    • 指定 environment variable TZ 也是相同效果

    2dotnetrun

心得

TZ ID 可以參考 List of tz database time zones

如果 application 部署是使用 container,可以在 dockerfile 中指定時區,這樣 application 本來就會 os 的時區設定

參考資訊

  1. How do I change timezone in a docker container?
  2. List of tz database time zones