using System.Globalization;
public static void Main()
string s = "2024-07-03T00:03:51.0616966Z";
var utcNow = DateTime.ParseExact(s, "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'", CultureInfo.InvariantCulture);
var today = DateOnly.FromDateTime(utcNow);
var currentUtcTime = TimeOnly.FromDateTime(utcNow);
var timeZone = "America/Los_Angeles";
var customerCollectionTimes = new CustomerCollectionTimes(TimeOnly.Parse("05:00"), TimeOnly.Parse("18:00"));
var carrierCollectionTimes = new CarrierCollectionTimes(TimeOnly.Parse("23:59"), TimeOnly.Parse("16:00"));
var localCurrentTime = GetLocalCurrentTime(timeZone, today.ToDateTime(currentUtcTime));
var expectedSameDayBookingLocalTime = ExpectedSameDayBookingTime(
IsExpectedBookingTimeAfterTheConcurrencyBufferWindow(
expectedSameDayBookingLocalTime
Console.WriteLine($"Shipment can not be scheduled in timezone {timeZone} for same day collection at local time {localCurrentTime} because it is after {expectedSameDayBookingLocalTime}");
private static bool IsExpectedBookingTimeAfterTheConcurrencyBufferWindow(
TimeOnly localCollectionTime,
TimeOnly expectedSameDayBookingLocalTime
return localCollectionTime >= expectedSameDayBookingLocalTime;
private static TimeOnly GetLocalCurrentTime(string timeZone, DateTime currentDateTime) =>
.ConvertTimeBySystemTimeZoneId(currentDateTime, "Etc/UTC", timeZone)
private static TimeOnly ExpectedSameDayBookingTime(
CustomerCollectionTimes customerCollectionTimes,
CarrierCollectionTimes carrierCollectionTimes
customerCollectionTimes.CloseTime,
carrierCollectionTimes.BookingCutOffTime,
carrierCollectionTimes.CollectionCutOffTime
public readonly record struct CustomerCollectionTimes(TimeOnly ReadyTime, TimeOnly CloseTime);
public readonly record struct CarrierCollectionTimes(
TimeOnly BookingCutOffTime,
TimeOnly CollectionCutOffTime
private static TimeOnly MinTimeOnly(
TimeOnly firstTimeToCompare,
TimeOnly secondTimeToCompare
) => firstTimeToCompare < secondTimeToCompare ? firstTimeToCompare : secondTimeToCompare;