如何確定給定的DateTime
是否在一年的某個子集中。作爲一個例子,我想知道今天是在12月6日到1月2日之間。子集被表示爲一個日期範圍,並且可能會在給定的例子中「環繞」。檢查給定日期是否屬於一年中的某個子集(例如,晚於12月6日)
讓我們假設UTC使夏令時等不是問題。
有沒有一種乾淨的方式來與.NET BCL做到這一點?
要檢查的日期和日期範圍的「結束點」應該是任意的。
如何確定給定的DateTime
是否在一年的某個子集中。作爲一個例子,我想知道今天是在12月6日到1月2日之間。子集被表示爲一個日期範圍,並且可能會在給定的例子中「環繞」。檢查給定日期是否屬於一年中的某個子集(例如,晚於12月6日)
讓我們假設UTC使夏令時等不是問題。
有沒有一種乾淨的方式來與.NET BCL做到這一點?
要檢查的日期和日期範圍的「結束點」應該是任意的。
你明確地陳述日期,所以我假設時間不是問題,我們可以忽略夏令時複雜度et.al.在這種情況下,您可以對年份的日期進行簡單的數字表達式,並且對於環繞式情況有一些小邏輯。我並不是說它很漂亮,但是它讓你感覺到了。例如:
void Main()
{
var range = new DateRange(new DateTime(2015,12,6), new DateTime(2016,1,2));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 12, 28)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 1)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 1, 3)));
Console.WriteLine(range.IsDateInRange(new DateTime(2015, 11, 28)));
}
public class DateRange
{
public const int OneYearWrap = 1200;
public int BeginValue { get; private set; }
public int EndValue { get; private set; }
public DateRange(DateTime begin, DateTime end)
{
BeginValue = DateValue(begin);
EndValue = DateValue(end);
if (EndValue < BeginValue)
EndValue += OneYearWrap;
}
public bool IsDateInRange(DateTime date)
{
int dateValue = DateValue(date);
if (EndValue > OneYearWrap && dateValue < BeginValue)
dateValue += OneYearWrap;
return dateValue >= BeginValue && dateValue <= EndValue;
}
int DateValue(DateTime date)
{
return date.Month * 100 + date.Day;
}
}
這應該工作。 – boot4life
需求不足。作爲開始/結束/檢查日期,29位二字怎麼辦?而6月12日 - 1月不是「一年的範圍」。它重疊2年。 –
@HenkHolterman這比我想象的更復雜。兩年的重疊部分是故意的。不知道該怎麼做29日,也夏令時。 – boot4life
請注意,時間是艱難的。 http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time –