using NodaTime.TimeZones;
using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
public static List<string> GetOlsonTimeZoneList()
return new List<string>(TzdbDateTimeZoneSource.Default.ZoneLocations.Select(item => item.ZoneId).OrderBy(item => item));
public static DateTime UTCtoLocal(DateTime dateTime, string timeZoneId)
var instant = Instant.FromDateTimeUtc(dateTime);
var timeZoneProvider = DateTimeZoneProviders.Tzdb;
var usersTimezoneId = timeZoneId;
var usersTimezone = timeZoneProvider[usersTimezoneId];
var usersZonedDateTime = instant.InZone(usersTimezone);
return usersZonedDateTime.ToDateTimeUnspecified();
public static string IanaToWindows(string ianaZoneId)
"Etc/UTC", "Etc/UCT", "Etc/GMT"
if (utcZones.Contains(ianaZoneId, StringComparer.Ordinal))
var tzdbSource = TzdbDateTimeZoneSource.Default;
var links = tzdbSource.CanonicalIdMap.Where(x => x.Value.Equals(ianaZoneId, StringComparison.Ordinal)).Select(x => x.Key);
var possibleZones = tzdbSource.CanonicalIdMap.ContainsKey(ianaZoneId) ? links.Concat(new[]
tzdbSource.CanonicalIdMap[ianaZoneId], ianaZoneId
var mappings = tzdbSource.WindowsMapping.MapZones;
var item = mappings.FirstOrDefault(x => x.TzdbIds.Any(possibleZones.Contains));
public static string WindowsToIana(string windowsZoneId)
if (windowsZoneId.Equals("UTC", StringComparison.Ordinal))
var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;
var tzi = TimeZoneInfo.FindSystemTimeZoneById(windowsZoneId);
var tzid = tzdbSource.MapTimeZoneId(tzi);
return tzid == null ? null : tzdbSource.CanonicalIdMap[tzid];
public static string LocationToTimeZone(double latitude, double longitude)
var client = new RestClient("https://maps.googleapis.com/maps/api/timezone/json");
var request = new RestRequest(Method.GET);
request.AddParameter("location", latitude + "," + longitude);
request.AddParameter("timestamp", ToTimestamp(DateTime.UtcNow));
request.AddParameter("sensor", "false");
request.AddHeader("cache-control", "no-cache");
var response = client.Execute<GoogleTimeZoneResult>(request);
if (response.StatusCode != HttpStatusCode.OK)
return "America/Chicago";
return response.Data.Status != "OK" ? "America/Chicago" : response.Data.TimeZoneId;
return "America/Chicago";
private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
public static long ToTimestamp(DateTime value)
var elapsedTime = value - Epoch;
return (long)elapsedTime.TotalSeconds;
public class GoogleTimeZoneResult
[JsonProperty("dstOffset")]
[JsonProperty("rawOffset")]
[JsonProperty("timeZoneId")]
[JsonProperty("timeZoneName")]
public string TimeZoneName