The method is an extension to the DateTime type, meaning you can use it by typing .AsLocalTimeForGivenCountryFromUtc(countryCode) after a variable or function returning that type. The countryCode parameter is a string, and must be a two-letter ISO 3166-1 country code.
You need to import John Skeets NodaTime library from NuGet.
Code:
using NodaTime.TimeZones; using System; using System.Linq; namespace MyNameSpace { public static class DateTimeExtension { public static DateTime AsLocalTimeForGivenCountryFromUtc(this DateTime utcDateTime, string countryCode) { //no matter what tz info is on the date, assume it is UTC var dte = new DateTime(utcDateTime.Year, utcDateTime.Month, utcDateTime.Day, utcDateTime.Hour, utcDateTime.Minute, utcDateTime.Second, DateTimeKind.Utc); var tzMapping = TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones.FirstOrDefault(t => t.Territory == countryCode); //NodaTime var tz = TimeZoneInfo.FindSystemTimeZoneById(tzMapping.WindowsId); return TimeZoneInfo.ConvertTimeFromUtc(dte, tz); } } }