using System.ComponentModel.DataAnnotations;
public static void Main()
Console.WriteLine("--Main--");
var TestData_13201 = new TestData()
TimeOfJobRunToTest = new DateTime(2023, 10, 30, 21, 22, 53),
LastRunDate = new DateTime(2023, 10, 30, 18, 52, 51)
public static void Test(TestData testData)
Console.WriteLine("--Test--");
var startTime = new TimeSpan(18, 30, 00);
var endTime = new TimeSpan(23, 59, 00);
var timeZone = TimeZone.GMTStandard;
Console.WriteLine("startTime: " + startTime.ToString());
Console.WriteLine("endTime: " + endTime.ToString());
Console.WriteLine("lastRunDate: " + testData.LastRunDate.ToString("yyyy-MMM-dd HH:mm"));
Console.WriteLine("timeOfJobRunToTest: " + testData.TimeOfJobRunToTest.ToString("yyyy-MMM-dd HH:mm"));
var isInExecPeriodRegional = testData.TimeOfJobRunToTest.IsInExecutionPeriodRegional(startTime, endTime, testData.LastRunDate, timeZone);
Console.WriteLine("isInExecPeriodRegional: " + isInExecPeriodRegional);
public DateTime TimeOfJobRunToTest {get;set;}
public DateTime LastRunDate {get;set;}
public static class DateTimeExt
public static DateTime ToUTCDate(this DateTime regionalDate, TimeZone timeZone)
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(regionalDate, DateTimeKind.Unspecified), TimeZoneInfo.FindSystemTimeZoneById(timeZone.GetAttributeOfType<WindowsTimeZoneIDAttribute>().WindowsTimeZoneID));
public static DateTime? ToUTCDate(this DateTime? regionalDate, TimeZone timeZone)
return regionalDate?.ToUTCDate(timeZone);
public static DateTime ReplaceTime(this DateTime baseDate, TimeSpan timePart)
return baseDate.Date.Add(timePart);
public static bool IsInExecutionPeriodRegional(this DateTime nowUtc, TimeSpan start, TimeSpan end,
DateTime? lastExecutionDateUtc, TimeZone timeZone)
Console.WriteLine("---IsInExecutionPeriodRegional---");
var lastExecutionDate = lastExecutionDateUtc.HasValue
? lastExecutionDateUtc.Value.ToRegionalDate(timeZone)
Console.WriteLine("lastExecutionDateUtc.Value.ToRegionalDate(timeZone): " + lastExecutionDateUtc.Value.ToRegionalDate(timeZone).ToString("yyyy-MMM-dd HH:mm"));
Console.WriteLine("nowUtc.ToRegionalDate(timeZone): " + nowUtc.ToRegionalDate(timeZone).ToString("yyyy-MMM-dd HH:mm"));
var returnVal = nowUtc.ToRegionalDate(timeZone).IsInExecutionPeriod(start, end, lastExecutionDate);
Console.WriteLine("nowUtc.ToRegionalDate(timeZone).IsInExecutionPeriod(start, end, lastExecutionDate): " + returnVal);
public static bool IsInExecutionPeriod(this DateTime now, TimeSpan start, TimeSpan end, DateTime? lastExecutionDate)
Console.WriteLine("---IsInExecutionPeriod---");
bool endsSameDay = end >= start;
Console.WriteLine("start: " + start);
Console.WriteLine("end: " + end);
Console.WriteLine("endsSameDay: " + endsSameDay);
if (lastExecutionDate.HasValue)
var lastExecution = lastExecutionDate.Value;
Console.WriteLine("lastExecution: " + lastExecution.ToString("yyyy-MMM-dd HH:mm"));
lastPeriodEnd = endsSameDay || (lastExecution.TimeOfDay <= end)
? lastExecution.ReplaceTime(end)
: lastExecution.Date.AddDays(1).ReplaceTime(end);
lastPeriodEnd = DateTime.MinValue;
Console.WriteLine("lastPeriodEnd: " + lastPeriodEnd.ToString("yyyy-MMM-dd HH:mm"));
Console.WriteLine("now: " + now.ToString("yyyy-MMM-dd HH:mm"));
if (now <= lastPeriodEnd)
Console.WriteLine("now <= lastPeriodEnd, returning false");
var nowTime = now.TimeOfDay;
return nowTime >= start && nowTime <= end;
return nowTime >= start || nowTime <= end;
public static DateTime ToRegionalDate(this DateTime utcDate, TimeZone timeZone)
return TimeZoneInfo.ConvertTimeFromUtc(utcDate, timeZone.ToTimeZoneInfo());
public static TimeZoneInfo ToTimeZoneInfo(this TimeZone timeZone)
return TimeZoneInfo.FindSystemTimeZoneById(timeZone.GetAttributeOfType<WindowsTimeZoneIDAttribute>().WindowsTimeZoneID);
public static class EnumExt
public static T GetAttributeOfType<T>(this Enum enumVal) where T : System.Attribute
var memInfo = GetEnumMember(enumVal);
var attributes = memInfo.GetCustomAttributes(typeof(T), false);
return (attributes.Length > 0) ? (T)attributes[0] : null;
public static object[] GetCustomAttributes(this Enum @this)
var enumMember = GetEnumMember(@this);
return enumMember.GetCustomAttributes(false);
private static MemberInfo GetEnumMember(Enum enumValue)
return enumValue.GetType()
.FirstOrDefault(x => x.Name == enumValue.ToString());
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)]
public sealed class WindowsTimeZoneIDAttribute : Attribute
public string WindowsTimeZoneID { get; set; }
public WindowsTimeZoneIDAttribute(string windowsTimeZoneID)
WindowsTimeZoneID = windowsTimeZoneID;
[WindowsTimeZoneID("Dateline Standard Time")]
[Display(Name = "(UTC-12:00) International Date Line West")]
[WindowsTimeZoneID("UTC-11")]
[Display(Name = "(UTC-11:00) Coordinated Universal Time-11")]
[WindowsTimeZoneID("Hawaiian Standard Time")]
[Display(Name = "(UTC-10:00) Hawaii")]
[WindowsTimeZoneID("Alaskan Standard Time")]
[Display(Name = "(UTC-09:00) Alaska")]
[WindowsTimeZoneID("Pacific Standard Time (Mexico)")]
[Display(Name = "(UTC-08:00) Baja California")]
PacificStandardMexico = 5,
[WindowsTimeZoneID("Pacific Standard Time")]
[Display(Name = "(UTC-08:00) Pacific Time (US & Canada)")]
[WindowsTimeZoneID("US Mountain Standard Time")]
[Display(Name = "(UTC-07:00) Arizona")]
[WindowsTimeZoneID("Mountain Standard Time (Mexico)")]
[Display(Name = "(UTC-07:00) Chihuahua, La Paz, Mazatlan")]
MountainStandardMexico = 8,
[WindowsTimeZoneID("Mountain Standard Time")]
[Display(Name = "(UTC-07:00) Mountain Time (US & Canada)")]
[WindowsTimeZoneID("Central America Standard Time")]
[Display(Name = "(UTC-06:00) Central America")]
CentralAmericaStandard = 10,
[WindowsTimeZoneID("Central Standard Time")]
[Display(Name = "(UTC-06:00) Central Time (US & Canada)")]
[WindowsTimeZoneID("Central Standard Time (Mexico)")]
[Display(Name = "(UTC-06:00) Guadalajara, Mexico City, Monterrey")]
CentralStandardMexico = 12,
[WindowsTimeZoneID("Canada Central Standard Time")]
[Display(Name = "(UTC-06:00) Saskatchewan")]
CanadaCentralStandard = 13,
[WindowsTimeZoneID("SA Pacific Standard Time")]
[Display(Name = "(UTC-05:00) Bogota, Lima, Quito, Rio Branco")]
[WindowsTimeZoneID("Eastern Standard Time")]
[Display(Name = "(UTC-05:00) Eastern Time (US & Canada)")]
[WindowsTimeZoneID("US Eastern Standard Time")]
[Display(Name = "(UTC-05:00) Indiana (East)")]
[WindowsTimeZoneID("Venezuela Standard Time")]
[Display(Name = "(UTC-04:30) Caracas")]
[WindowsTimeZoneID("Paraguay Standard Time")]
[Display(Name = "(UTC-04:00) Asuncion")]
[WindowsTimeZoneID("Atlantic Standard Time")]
[Display(Name = "(UTC-04:00) Atlantic Time (Canada)")]
[WindowsTimeZoneID("Central Brazilian Standard Time")]
[Display(Name = "(UTC-04:00) Cuiaba")]
CentralBrazilianStandard = 20,
[WindowsTimeZoneID("SA Western Standard Time")]
[Display(Name = "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan")]
[WindowsTimeZoneID("Newfoundland Standard Time")]
[Display(Name = "(UTC-03:30) Newfoundland")]
NewfoundlandStandard = 22,
[WindowsTimeZoneID("E. South America Standard Time")]
[Display(Name = "(UTC-03:00) Brasilia")]
EastSouthAmericaStandard = 23,
[WindowsTimeZoneID("Argentina Standard Time")]
[Display(Name = "(UTC-03:00) Buenos Aires")]
[WindowsTimeZoneID("SA Eastern Standard Time")]
[Display(Name = "(UTC-03:00) Cayenne, Fortaleza")]
[WindowsTimeZoneID("Greenland Standard Time")]
[Display(Name = "(UTC-03:00) Greenland")]
[WindowsTimeZoneID("Montevideo Standard Time")]
[Display(Name = "(UTC-03:00) Montevideo")]
[WindowsTimeZoneID("Bahia Standard Time")]
[Display(Name = "(UTC-03:00) Salvador")]
[WindowsTimeZoneID("Pacific SA Standard Time")]
[Display(Name = "(UTC-03:00) Santiago")]
[WindowsTimeZoneID("UTC-02")]
[Display(Name = "(UTC-02:00) Coordinated Universal Time-02")]
[WindowsTimeZoneID("Mid-Atlantic Standard Time")]
[Display(Name = "(UTC-02:00) Mid-Atlantic - Old")]
MidAtlanticStandard = 31,
[WindowsTimeZoneID("Azores Standard Time")]
[Display(Name = "(UTC-01:00) Azores")]
[WindowsTimeZoneID("Cape Verde Standard Time")]
[Display(Name = "(UTC-01:00) Cabo Verde Is.")]
[WindowsTimeZoneID("Morocco Standard Time")]
[Display(Name = "(UTC) Casablanca")]
[WindowsTimeZoneID("UTC")]
[Display(Name = "(UTC) Coordinated Universal Time")]
[WindowsTimeZoneID("GMT Standard Time")]
[Display(Name = "(UTC) Dublin, Edinburgh, Lisbon, London")]
[WindowsTimeZoneID("Greenwich Standard Time")]
[Display(Name = "(UTC) Monrovia, Reykjavik")]
[WindowsTimeZoneID("W. Europe Standard Time")]
[Display(Name = "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna")]
[WindowsTimeZoneID("Central Europe Standard Time")]
[Display(Name = "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague")]
CentralEuropeStandard = 39,
[WindowsTimeZoneID("Romance Standard Time")]
[Display(Name = "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris")]
[WindowsTimeZoneID("Central European Standard Time")]
[Display(Name = "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb")]
CentralEuropeanStandard = 41,
[WindowsTimeZoneID("W. Central Africa Standard Time")]
[Display(Name = "(UTC+01:00) West Central Africa")]
WestCentralAfricaStandard = 42,
[WindowsTimeZoneID("Namibia Standard Time")]
[Display(Name = "(UTC+01:00) Windhoek")]
[WindowsTimeZoneID("Jordan Standard Time")]
[Display(Name = "(UTC+02:00) Amman")]
[WindowsTimeZoneID("GTB Standard Time")]
[Display(Name = "(UTC+02:00) Athens, Bucharest")]
[WindowsTimeZoneID("Middle East Standard Time")]
[Display(Name = "(UTC+02:00) Beirut")]
[WindowsTimeZoneID("Egypt Standard Time")]
[Display(Name = "(UTC+02:00) Cairo")]
[WindowsTimeZoneID("Syria Standard Time")]
[Display(Name = "(UTC+02:00) Damascus")]
[WindowsTimeZoneID("E. Europe Standard Time")]
[Display(Name = "(UTC+02:00) E. Europe")]
[WindowsTimeZoneID("South Africa Standard Time")]
[Display(Name = "(UTC+02:00) Harare, Pretoria")]
SouthAfricaStandard = 50,
[WindowsTimeZoneID("FLE Standard Time")]
[Display(Name = "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius")]
[WindowsTimeZoneID("Turkey Standard Time")]
[Display(Name = "(UTC+02:00) Istanbul")]
[WindowsTimeZoneID("Israel Standard Time")]
[Display(Name = "(UTC+02:00) Jerusalem")]
[WindowsTimeZoneID("Kaliningrad Standard Time")]
[Display(Name = "(UTC+02:00) Kaliningrad (RTZ 1)")]
KaliningradStandard = 54,
[WindowsTimeZoneID("Libya Standard Time")]
[Display(Name = "(UTC+02:00) Tripoli")]
[WindowsTimeZoneID("Arabic Standard Time")]
[Display(Name = "(UTC+03:00) Baghdad")]
[WindowsTimeZoneID("Arab Standard Time")]
[Display(Name = "(UTC+03:00) Kuwait, Riyadh")]
[WindowsTimeZoneID("Belarus Standard Time")]
[Display(Name = "(UTC+03:00) Minsk")]
[WindowsTimeZoneID("Russian Standard Time")]
[Display(Name = "(UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)")]
[WindowsTimeZoneID("E. Africa Standard Time")]
[Display(Name = "(UTC+03:00) Nairobi")]
[WindowsTimeZoneID("Iran Standard Time")]
[Display(Name = "(UTC+03:30) Tehran")]
[WindowsTimeZoneID("Arabian Standard Time")]
[Display(Name = "(UTC+04:00) Abu Dhabi, Muscat")]
[WindowsTimeZoneID("Azerbaijan Standard Time")]
[Display(Name = "(UTC+04:00) Baku")]
[WindowsTimeZoneID("Russia Time Zone 3")]
[Display(Name = "(UTC+04:00) Izhevsk, Samara (RTZ 3)")]
[WindowsTimeZoneID("Mauritius Standard Time")]
[Display(Name = "(UTC+04:00) Port Louis")]
[WindowsTimeZoneID("Georgian Standard Time")]
[Display(Name = "(UTC+04:00) Tbilisi")]
[WindowsTimeZoneID("Caucasus Standard Time")]
[Display(Name = "(UTC+04:00) Yerevan")]
[WindowsTimeZoneID("Afghanistan Standard Time")]
[Display(Name = "(UTC+04:30) Kabul")]
AfghanistanStandard = 68,
[WindowsTimeZoneID("West Asia Standard Time")]
[Display(Name = "(UTC+05:00) Ashgabat, Tashkent")]
[WindowsTimeZoneID("Ekaterinburg Standard Time")]
[Display(Name = "(UTC+05:00) Ekaterinburg (RTZ 4)")]
EkaterinburgStandard = 70,
[WindowsTimeZoneID("Pakistan Standard Time")]
[Display(Name = "(UTC+05:00) Islamabad, Karachi")]
[WindowsTimeZoneID("India Standard Time")]
[Display(Name = "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi")]
[WindowsTimeZoneID("Sri Lanka Standard Time")]
[Display(Name = "(UTC+05:30) Sri Jayawardenepura")]
[WindowsTimeZoneID("Nepal Standard Time")]
[Display(Name = "(UTC+05:45) Kathmandu")]
[WindowsTimeZoneID("Central Asia Standard Time")]
[Display(Name = "(UTC+06:00) Astana")]
CentralAsiaStandard = 75,
[WindowsTimeZoneID("Bangladesh Standard Time")]
[Display(Name = "(UTC+06:00) Dhaka")]
[WindowsTimeZoneID("N. Central Asia Standard Time")]
[Display(Name = "(UTC+06:00) Novosibirsk (RTZ 5)")]
NorthCentralAsiaStandard = 77,
[WindowsTimeZoneID("Myanmar Standard Time")]
[Display(Name = "(UTC+06:30) Yangon (Rangoon)")]
[WindowsTimeZoneID("SE Asia Standard Time")]
[Display(Name = "(UTC+07:00) Bangkok, Hanoi, Jakarta")]
[WindowsTimeZoneID("North Asia Standard Time")]
[Display(Name = "(UTC+07:00) Krasnoyarsk (RTZ 6)")]
[WindowsTimeZoneID("China Standard Time")]
[Display(Name = "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi")]
[WindowsTimeZoneID("North Asia East Standard Time")]
[Display(Name = "(UTC+08:00) Irkutsk (RTZ 7)")]
NorthAsiaEastStandard = 82,
[WindowsTimeZoneID("Singapore Standard Time")]
[Display(Name = "(UTC+08:00) Kuala Lumpur, Singapore")]
[WindowsTimeZoneID("W. Australia Standard Time")]
[Display(Name = "(UTC+08:00) Perth")]
WestAustraliaStandard = 84,
[WindowsTimeZoneID("Taipei Standard Time")]
[Display(Name = "(UTC+08:00) Taipei")]
[WindowsTimeZoneID("Ulaanbaatar Standard Time")]
[Display(Name = "(UTC+08:00) Ulaanbaatar")]
UlaanbaatarStandard = 86,
[WindowsTimeZoneID("Tokyo Standard Time")]
[Display(Name = "(UTC+09:00) Osaka, Sapporo, Tokyo")]
[WindowsTimeZoneID("Korea Standard Time")]
[Display(Name = "(UTC+09:00) Seoul")]
[WindowsTimeZoneID("Yakutsk Standard Time")]
[Display(Name = "(UTC+09:00) Yakutsk (RTZ 8)")]
[WindowsTimeZoneID("Cen. Australia Standard Time")]
[Display(Name = "(UTC+09:30) Adelaide")]
CentralAustraliaStandard = 90,
[WindowsTimeZoneID("AUS Central Standard Time")]
[Display(Name = "(UTC+09:30) Darwin")]
[WindowsTimeZoneID("E. Australia Standard Time")]
[Display(Name = "(UTC+10:00) Brisbane")]
EastAustraliaStandard = 92,
[WindowsTimeZoneID("AUS Eastern Standard Time")]
[Display(Name = "(UTC+10:00) Canberra, Melbourne, Sydney")]
[WindowsTimeZoneID("West Pacific Standard Time")]
[Display(Name = "(UTC+10:00) Guam, Port Moresby")]
WestPacificStandard = 94,
[WindowsTimeZoneID("Tasmania Standard Time")]
[Display(Name = "(UTC+10:00) Hobart")]
[WindowsTimeZoneID("Magadan Standard Time")]
[Display(Name = "(UTC+10:00) Magadan")]
[WindowsTimeZoneID("Vladivostok Standard Time")]
[Display(Name = "(UTC+10:00) Vladivostok, Magadan (RTZ 9)")]
VladivostokStandard = 97,
[WindowsTimeZoneID("Russia Time Zone 10")]
[Display(Name = "(UTC+11:00) Chokurdakh (RTZ 10)")]
[WindowsTimeZoneID("Central Pacific Standard Time")]
[Display(Name = "(UTC+11:00) Solomon Is., New Caledonia")]
CentralPacificStandard = 99,
[WindowsTimeZoneID("Russia Time Zone 11")]
[Display(Name = "(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky (RTZ 11)")]
[WindowsTimeZoneID("New Zealand Standard Time")]
[Display(Name = "(UTC+12:00) Auckland, Wellington")]
NewZealandStandard = 101,
[WindowsTimeZoneID("UTC+12")]
[Display(Name = "(UTC+12:00) Coordinated Universal Time+12")]
[WindowsTimeZoneID("Fiji Standard Time")]
[Display(Name = "(UTC+12:00) Fiji")]
[WindowsTimeZoneID("Kamchatka Standard Time")]
[Display(Name = "(UTC+12:00) Petropavlovsk-Kamchatsky - Old")]
[WindowsTimeZoneID("Tonga Standard Time")]
[Display(Name = "(UTC+13:00) Nuku'alofa")]
[WindowsTimeZoneID("Samoa Standard Time")]
[Display(Name = "(UTC+13:00) Samoa")]
[WindowsTimeZoneID("Line Islands Standard Time")]
[Display(Name = "(UTC+14:00) Kiritimati Island")]
LineIslandsStandard = 107,