たとえば、次のことを実行しようとすると、.
TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")
ローカルコンピューターでTimeZone
を使用できないというエラーが表示されます。これをローカルで実行すると機能しますが、Windowsで実行します。デプロイすると、NginxのUnixマシンで実行されます。 Unixに関しては、FindSystemTimeZoneById
が間違ったフォルダを探していることがわかります。これを機能させる方法はありますか?
システムのタイムゾーンを使用する.Net Core。残念ながら、WindowsとLinuxではタイムゾーンシステムが異なります。今、あなたは2つの方法があります:
試して頂けますか?
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
前の回答 をオフにすると、実行中の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.");
}
Windowsタイムゾーンを試して、Windowsが存在しない場合にIANAにフォールバックする場合:
var tzi = TimeZoneInfo.GetSystemTimeZones().Any(x => x.Id == "Eastern Standard Time") ?
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") :
TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
私は次のようにして、私の開発Dockerイメージでこのユースケースをサポートすることができました。
cp /usr/share/zoneinfo/America/Los_Angeles "/usr/share/zoneinfo/Pacific Standard Time"
明らかに、それが本番環境への展開に適しているとは思いません。しかし、それはいくつかのシナリオで役立つかもしれません。