2016-11-30 1 views
2

У меня есть приложение asp.net mvc с ядром dotnet, которое должно делать преобразования часовых поясов между UTC, Центральным часовым поясом и сингапурским стандартным временем. У меня это работает в среде разработки Windows, используя метод TimeZoneInfo.FindSystemTimeZoneById, чтобы установить экземпляр часового пояса и передать этот экземпляр часового пояса в TimeZoneInfo.ConvertTime, чтобы получить время для требуемого часового пояса. Тем не менее, при развертывании веб-приложения для CentOS7 я получаю ошибку:dotnet core crossplatform (Windows & CentOS) ошибка преобразования часового пояса

"Could not find file '/usr/share/zoneinfo/Central Standard Time'."


Что мне нужно сделать, чтобы получить эту работу на обеих платформах?

public TimeZoneInfo TimeZoneInstance 
    { 
     get 
     { 
      if (_timeZoneInstance == null) 
      { 
       try 
       { 
        _timeZoneInstance = TimeZoneInfo.FindSystemTimeZoneById(TimeZone); 
       } 
       catch 
       { 
        TimeZone = "Central Standard Time"; 
        _timeZoneInstance = TimeZoneInfo.FindSystemTimeZoneById(TimeZone); 
       } 
      } 
      return _timeZoneInstance; 
     } 
     private set { _timeZoneInstance = value; } 
    } 

    public DateTime? GetUserTime(DateTime? utcTime = null) 
    { 

     if (utcTime == null) 
      return utcTime; 

     return TimeZoneInfo.ConvertTime(DateTime.SpecifyKind(utcTime.Value, DateTimeKind.Utc), TimeZoneInfo.Utc, TimeZoneInstance); 
    } 

    public DateTime? GetUtcTime(DateTime? localTime) 
    { 
     if (localTime == null) 
      return localTime; 



     return TimeZoneInfo.ConvertTime(localTime.Value, TimeZoneInstance, TimeZoneInfo.Utc); 
    } 

ответ

0

.NET ядро ​​на Windows, использует Windows time zone IDs в то время как .NET ядра на * Nix используют часовые пояса IANA.

Самый простой способ межплатформенных часовых поясов - использовать идентификаторы IANA с NodaTime. С NodaTime, вы можете получить временную зону с этим:

NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/Chicago"); 

Список часового пояса Идентификаторы доступны по адресу:

NodaTime.DateTimeZoneProviders.Tzdb.Ids 

Вам нужно добавить внешнюю зависимость и использовать NodaTime.DateTimeZone вместо TimeZoneInfo , Тем не менее, он более кросс-платформенный, чем TimeZoneInfo.

Смежные вопросы