TimeZoneInfo в .NET Core при размещении на unix (nginx)

Например, когда я пытаюсь сделать следующее.

TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")

Я получаю сообщение об ошибке, что TimeZone недоступно на локальном компьютере. Когда я запускаю его локально, он работает, но там я запускаю его на окнах. При развертывании он запускается на Unix-машине в Nginx. Я вижу, что FindSystemTimeZoneById ищет неправильную папку, когда дело доходит до Unix. Есть ли способ сделать эту работу?

Ответ 1

.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

Ответ 3

Если вы хотите попробовать часовой пояс Windows, а затем использовать IANA, если Windows не существует:

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

Ответ 4

Работая над предыдущим ответом, мы можем избежать дорогостоящего 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.");
}

Ответ 5

Мне удалось поддержать этот вариант использования в моем образе докера разработки, выполнив следующие действия:

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

Очевидно, я не думаю, что это было бы хорошей идеей для производственных развертываний. Но это может помочь в некоторых сценариях.