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"
Очевидно, я не думаю, что это было бы хорошей идеей для производственных развертываний. Но это может помочь в некоторых сценариях.