web-dev-qa-db-ja.com

UNIXでホストする場合の.NET CoreのTimeZoneInfo(nginx)

たとえば、次のことを実行しようとすると、.

TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")

ローカルコンピューターでTimeZoneを使用できないというエラーが表示されます。これをローカルで実行すると機能しますが、Windowsで実行します。デプロイすると、NginxのUnixマシンで実行されます。 Unixに関しては、FindSystemTimeZoneByIdが間違ったフォルダを探していることがわかります。これを機能させる方法はありますか?

23
noshitsherlock

システムのタイムゾーンを使用する.Net Core。残念ながら、WindowsとLinuxではタイムゾーンシステムが異なります。今、あなたは2つの方法があります:

20
J. Doe

試して頂けますか?

   TimeZoneInfo easternZone;
        try
        {
            easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        }
        catch (TimeZoneNotFoundException)
        {
            easternZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
        }

IANAタイムゾーンのリストはこちらで確認できます https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

11
Alvaro Bardaji

前の回答 をオフにすると、実行中のOSを確認することで、高価なtry/catchを回避できます。

using System;
using System.Runtime.InteropServices;

TimeZoneInfo easternStandardTime;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
  easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
  easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
  throw new NotImplementedException("I don't know how to do a lookup on a Mac.");
}
7
Uli

Windowsタイムゾーンを試して、Windowsが存在しない場合にIANAにフォールバックする場合:

var tzi  = TimeZoneInfo.GetSystemTimeZones().Any(x => x.Id == "Eastern Standard Time") ? 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") : 
    TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
4
sam

私は次のようにして、私の開発Dockerイメージでこのユースケースをサポートすることができました。

cp /usr/share/zoneinfo/America/Los_Angeles "/usr/share/zoneinfo/Pacific Standard Time"

明らかに、それが本番環境への展開に適しているとは思いません。しかし、それはいくつかのシナリオで役立つかもしれません。

1
EverPresent