using System.Collections.Generic;
public static void Main()
string inpunch = "2022-11-06T06:09:00.0000000Z";
DateTime indateTimePunch = XmlConvert.ToDateTime(inpunch, XmlDateTimeSerializationMode.Utc);
DateTime inpunchTimeUtc = indateTimePunch.ToUniversalTime();
ZonedDateTime inzonedDateTime = SetToZonedTimeFromUtc(inpunchTimeUtc, "NDT");
Console.WriteLine("Inpunch" + inzonedDateTime);
string outpunch = "2022-11-06T14:52:00.0000000Z";
DateTime outdateTimePunch = XmlConvert.ToDateTime(outpunch, XmlDateTimeSerializationMode.Utc);
DateTime outpunchTimeUtc = outdateTimePunch.ToUniversalTime();
ZonedDateTime outzonedDateTime = SetToZonedTimeFromUtc(outpunchTimeUtc, "NST");
Console.WriteLine("Outpunch" + outzonedDateTime);
Duration duration = outzonedDateTime.ToInstant() - inzonedDateTime.ToInstant();
double totalHours = duration.Ticks / (double)Duration.FromHours(1).Ticks;
Console.WriteLine("Duration between in and out: " + duration);
Console.WriteLine("Totalhours between in and out: " + totalHours);
catch (ArgumentException ex)
Console.WriteLine(ex.Message);
public static ZonedDateTime SetToZonedTimeFromUtc(DateTime punchTimeUtc, string timeZoneName)
DateTimeZone dateTimeZone = GetDateTimeZone(timeZoneName);
if (dateTimeZone != null)
ZonedDateTime dt = new ZonedDateTime(Instant.FromDateTimeUtc(punchTimeUtc), dateTimeZone);
throw new ArgumentException("Invalid time zone name:", timeZoneName);
public static DateTimeZone GetDateTimeZone(string timeZoneName)
if (string.IsNullOrEmpty(timeZoneName))
var timeZoneOffsets = new Dictionary<string, double>
if (timeZoneOffsets.ContainsKey(timeZoneName))
double offset = timeZoneOffsets[timeZoneName];
int minutes = (int)((offset - hours) * 60);
return DateTimeZone.ForOffset(Offset.FromHoursAndMinutes(hours, minutes));