using System.Globalization;
private static CultureInfo enUS = new CultureInfo("en-US");
private const string STANDARD_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static void Main()
NormalizeServiceRequestDates("2021-06-21 00:00:00", "", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
Console.WriteLine("4 hour");
NormalizeServiceRequestDates("2021-06-21 09:00:00", "", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
NormalizeServiceRequestDates("", "2021-06-21 00:00:00", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
NormalizeServiceRequestDates("2021-06-21 09:00:00", "2021-06-21 05:00:00", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
NormalizeServiceRequestDates("2021-06-21 09:00:00", "2021-06-21 13:00:00", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
NormalizeServiceRequestDates("2021-06-21 00:00:00", "2021-06-22 00:00:00", out date1, out date2);
Console.WriteLine(date1.ToString());
Console.WriteLine(date2.ToString());
public static bool NormalizeServiceRequestDates(string strDate1, string strDate2, out DateTime date1, out DateTime date2)
if (!NormalizeMidnightDateTo8AMTo5PMIfNeeded(strDate1, strDate2, out date1, out date2))
if (!NormalizeDateTo4HourDurationIfNeeded(strDate1, strDate2, out date1, out date2))
static bool NormalizeDateTo4HourDurationIfNeeded(string strDate1, string strDate2, out DateTime date1, out DateTime date2)
bool b1 = DateTime.TryParseExact(strDate1, STANDARD_DATE_FORMAT, enUS, DateTimeStyles.None, out date1);
bool b2 = DateTime.TryParseExact(strDate2, STANDARD_DATE_FORMAT, enUS, DateTimeStyles.None, out date2);
if (b1 && (!b2 || String.IsNullOrEmpty(strDate2)))
date2 = date2.AddHours(4);
static bool NormalizeMidnightDateTo8AMTo5PMIfNeeded(string strDate1, string strDate2, out DateTime date1, out DateTime date2)
bool dStart = DateTime.TryParseExact(strDate1, STANDARD_DATE_FORMAT, enUS, DateTimeStyles.None, out date1);
bool dEnd = DateTime.TryParseExact(strDate2, STANDARD_DATE_FORMAT, enUS, DateTimeStyles.None, out date2);
bool bIsStartMidnight = date1.Hour == 0 && date1.Minute == 0 && date1.Second == 0 && date1.Millisecond == 0 && dStart;
bool bIsEndMidnight = date2.Hour == 0 && date2.Minute == 0 && date2.Second == 0 && date2.Millisecond == 0 && dEnd;
if (bIsStartMidnight && !dEnd)
date1 = date1.ChangeHour(8);
date2 = date1.ChangeHour(17);
if (bIsStartMidnight && bIsEndMidnight)
date1 = date1.ChangeHour(8);
date2 = date1.ChangeHour(17);
if (bIsEndMidnight && !dStart)
date1 = date2.ChangeHour(8);
date2 = date2.ChangeHour(17);
public static DateTime ChangeHour(this DateTime dateTime, int hours = -1)
hours >= 0 ? hours : dateTime.Hour,