2015-12-17 25 views
2

如何確定給定的DateTime是否在一年的某個子集中。作爲一個例子,我想知道今天是在12月6日到1月2日之間。子集被表示爲一個日期範圍,並且可能會在給定的例子中「環繞」。檢查給定日期是否屬於一年中的某個子集(例如,晚於12月6日)

讓我們假設UTC使夏令時等不是問題。

有沒有一種乾淨的方式來與.NET BCL做到這一點?

要檢查的日期和日期範圍的「結束點」應該是任意的。

+1

需求不足。作爲開始/結束/檢查日期,29位二字怎麼辦?而6月12日 - 1月不是「一年的範圍」。它重疊2年。 –

+0

@HenkHolterman這比我想象的更復雜。兩年的重疊部分是故意的。不知道該怎麼做29日,也夏令時。 – boot4life

+1

請注意,時間是艱難的。 http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time –

回答

1

你明確地陳述日期,所以我假設時間不是問題,我們可以忽略夏令時複雜度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; 
    } 
} 
+0

這應該工作。 – boot4life

0

比較運算符超載DateTime。爲什麼不使用類似的東西:

DateTime x = ... 
if (x > new DateTime(2015, 12, 6)) { 
    // ... do whatever ... 
} 

並將骯髒的細節留給執行者(即BCL)。

+0

該OP已經「可以想到幾個方法來做到這一點」 –

+0

@HenkHolterman:我不明白什麼應該是不雅/使用比較運算符難以辨認...? – Dejan

+1

正如我理解這個問題,它表達了一個通用的日期範圍,而不是具體的日期。例如。應該將這一年排除在比較之外,默認運營商(幸運的是)不這樣做。 – driis

相關問題