Сначала я бы сделал метод расширения, так как это позволит использовать более описательные обозначения. Также немного упрощает задачу - оберните вокруг этого несколько модульных тестов, и вы можете быть уверены, что он ведет себя так, как вы думаете, что он должен вести себя:
public static class DateTimeExtensions {
private static readonly AEST = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
public static bool isWithinWindow( this DateTime instant ) {
DateTime dtNow = TimeZoneInfo.ConvertTimeFromUtc( DateTime.UtcNow, AEST ).Date ;
// 16:00 on the previous day
DateTime dtFrom = dtNow
.AddDays( -1 )
.AddHours( 16 )
.AddMinutes( 0 );
// 15:30 on the current day
DateTime dtThru = dtNow
.AddDays( 0 )
.AddHours( 15 )
.AddMinutes( 30 );
bool withinWindow = instant >= dtFrom && instant <= dtThru ;
return withinWindow ;
}
}
Как только вы это получите, вы можете сказать:
public void process() {
// date retrieved from the database (stored in AEST)
DateTime dbDateTimeInAEST = getSomeDateTimeValueFromDatabase() ;
bool isWithinWindow = dbDateTimeInAEST.isWithinWindow() ;
if ( isWithinWindow ) {
// do the processing for things that are within the window
}
else {
// do the processing for things that are outside the window
}
}
И, да, TimeZoneInfo
должен волшебным образом позаботиться о переключениях между летним и стандартным временем.