TimeZoneInfo in .NET Core when hosting on unix (nginx)
For example, when I try to do the following.
TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")
I get the error, that the TimeZone
is not available on the local computer. When I run this locally it works, but there I run it on windows. When deployed it runs on a Unix machine in Nginx. I can see that FindSystemTimeZoneById
is looking in the wrong folder when it comes to Unix. Is there any way to make this work?
Solution 1:
.Net Core using system timezone. Unfortunately Windows and Linux have different timezone system. Now you have two ways:
- Use other (and universal) impementation of timezone like Noda time
- Translate between Windows and IANA time zones, e.g. using the TimeZoneConverter micro-library.
Solution 2:
Working of off the previous answer, we can avoid the expensive try/catch
by checking which OS we're running on:
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))
{
easternStandardTime = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
}