我遇到了以下需求的有趣問題: 測試過程是否在同一天運行,如果不運行該過程。日期存儲爲DataTimeOffset。DateTimeOffset當天比較
我最初的做法是:
- 都轉換值UTC,因爲可能在不同的時區中創建這些日期,並有不同的偏移。
- 查看每個值的日期值。這是在轉換爲UTC後完成的,因爲Date方法會忽略偏移量。
大多數情況下,這工作,但我遇到了一種情況下,邏輯會失敗。如果其中一個值的時間接近前一天/第二天,以便轉換爲UTC時它將更改日期。如果其他值沒有時間也轉換爲前一天/下一天,則日期比較失敗。
所以我結束了以下邏輯包括情景:
public static bool SameDate(DateTimeOffset first, DateTimeOffset second)
{
bool returnValue = false;
DateTime firstAdjusted = first.ToUniversalTime().Date;
DateTime secondAdjusted = second.ToUniversalTime().Date;
// If date is now a day ahead after conversion, than add/deduct a day to other date if that date hasn't advanced
if (first.Date < firstAdjusted.Date && second.Date == secondAdjusted.Date)
secondAdjusted = secondAdjusted.Date.AddDays(1);
if (first.Date > firstAdjusted.Date && second.Date == secondAdjusted.Date)
secondAdjusted = secondAdjusted.Date.AddDays(-1);
if (second.Date < secondAdjusted.Date && first.Date == firstAdjusted.Date)
firstAdjusted = firstAdjusted.Date.AddDays(1);
if (second.Date > secondAdjusted.Date && first.Date == firstAdjusted.Date)
firstAdjusted = firstAdjusted.Date.AddDays(-1);
if (DateTime.Compare(firstAdjusted, secondAdjusted) == 0)
returnValue = true;
return returnValue;
}
這裏是被失敗的,現在通過單元測試:
[TestMethod()]
public void SameDateTest()
{
DateTimeOffset current = DateTimeOffset.Now;
DateTimeOffset first = current;
DateTimeOffset second = current;
// 23 hours later, next day, with negative offset (EST) -- First rolls over
first = new DateTimeOffset(2014, 1, 1, 19, 0, 0, new TimeSpan(-5, 0, 0));
second = new DateTimeOffset(2014, 1, 2, 18, 0, 0, new TimeSpan(-5, 0, 0));
Assert.IsFalse(Common.SameDate(first, second));
// 23 hours earlier, next day, with postive offset -- First rollovers
first = new DateTimeOffset(2014, 1, 1, 4, 0, 0, new TimeSpan(5, 0, 0));
second = new DateTimeOffset(2014, 1, 2, 5, 0, 0, new TimeSpan(5, 0, 0));
Assert.IsFalse(Common.SameDate(first, second));
// 23 hours later, next day, with negative offset (EST) -- Second rolls over
first = new DateTimeOffset(2014, 1, 2, 18, 0, 0, new TimeSpan(-5, 0, 0));
second = new DateTimeOffset(2014, 1, 1, 19, 0, 0, new TimeSpan(-5, 0, 0));
Assert.IsFalse(Common.SameDate(first, second));
// 23 hours earlier, next day, with postive offset -- Second rolls over
first = new DateTimeOffset(2014, 1, 2, 5, 0, 0, new TimeSpan(5, 0, 0));
second = new DateTimeOffset(2014, 1, 1, 4, 0, 0, new TimeSpan(5, 0, 0));
Assert.IsFalse(Common.SameDate(first, second));
}
我的直覺是,有比基於其他值的遞增/遞減更清潔的方法。有更好的方法嗎?
的主要標準:
- 調整兩個日期爲具有相同的偏移量。
- 只有在第一個和第二個日期都在同一日曆日內發生,而不是在24小時內才返回true。
你所做的是一個肯定的跡象,表明方法很差。根據我的經驗,處理日期/時間的最佳方法是將它們存儲爲UTC或具有特定偏移量。任何「數學」工作都會消失,現在您可以使用標準日期時間API轉換爲UI顯示等。 – 2014-11-23 19:18:27
它們與偏移量一起存儲,但偏移量不總是相同。例如,我們通常存儲東部時區的偏移量,但取決於夏令時,它可以是-4或-5。 – Josh 2014-11-23 19:30:46
在您的示例中,使用帶有和不帶夏令時的東部時區,實際上應該表示爲兩個不同的時區:冬季的EST(UTC-0500)和夏季的EDT(UTC-0400)。 – 2014-11-23 19:42:33