簡體   English   中英

在C#中比較DateTimeOffset

[英]Comparing DateTimeOffset's in C#

我正在嘗試比較兩個DateTimeOffsets,但是DateTimeOffset.Compare()函數無法按預期運行。 我創建了示例腳本來演示該問題。 在此示例中,我期望比較dateA和dateB的結果為零(相同)。

using System;
namespace ComparingDateTimeOffset
{
   class Program
   {
       static void Main(string[] args)
       {
           DateTimeOffset dateA = DateTimeOffset.Now;
           Thread.Sleep(1);
           DateTimeOffset dateB = DateTimeOffset.Now;

           Console.WriteLine("dateA =" + dateA);
           Console.WriteLine("dateB =" + dateB);

           Console.WriteLine(DateTimeOffset.Compare(dateA, dateB) == 0
            ? "dateA and dateB are the same"
            : "dateA and dateB are NOT the same");

           Console.WriteLine("Press any key to exit");
           Console.ReadKey();
       }
   }
}

以上程序的結果是

dateA =17/02/2016 09:09:21 +00:00
dateB =17/02/2016 09:09:21 +00:00
dateA and dateB are NOT the same
Press any key to exit

在控制台輸出中,看起來兩個日期相等。 但是比較函數表示兩個日期不同。 以下代碼顯示兩個日期之間相差幾毫秒。

long diff = (long) (dateB - dateA).TotalMilliseconds;
Console.WriteLine("Time differance in milliseconds =" + diff);

為了避免使用DateTimeOffset.Compare函數。 我決定以秒為單位計算日期之間的差異,然后四舍五入到最接近的整數。 這可以正常工作。 誰能看到使用此方法的缺點?

Console.WriteLine((int)(dateB - dateA).TotalSeconds == 0
            ? "dateA and dateB are the same"
            : "dateA and dateB are NOT the same");

如果使用適當的格式說明符,例如往返格式"o" ,可以看到您的時間跨度不同。

dateA.ToString("o")

下面是一些有關如何截斷毫秒的示例。

Sleep(1)將僅睡眠1毫秒。 因此,大概dateAdateB僅1或2毫秒。

由於您僅將日期/時間值打印到分鍾和秒,因此看不到實際的差異。 如果您要使用Console.WriteLine("dateA =" + dateA.ToString("dd/MM/yyyy HH:mm:ss.fff");則會發現兩者之間的區別。

如果要等待1秒鍾,則應該執行Sleep(1000)

首先, DateTimeOffsetDateTime精度比毫秒更好。 它們代表的最小單位是“滴答”,即100ns。 換句話說,小數秒有七個小數位,而不是三個 (計算機的時鍾本身並不是那么精確,但是這些數據結構仍然可以以這種精確度來表示 。)

最終,您問(在問題注釋中):

...如何比較兩個datetimeoffset忽略毫秒?

因此,知道我們知道您的要求后,請考慮僅忽略小數秒就無法解決問題。

  • 考慮A是否有3.9999999秒, B是否有4.0000001。
    截斷小數將得出A == 3B == 4 ,因此A != B

  • 考慮A是否有3.4999999秒, B是否有3.5000001。
    四舍五入小數將得出A == 3B == 4 ,因此A != B

因此, 不管是截斷或四舍五入將解決所有的用例。 您不能保證兩個連續時鍾讀數之間的值將被截斷或四舍五入為相同的值。

相反,按照您的建議,確定兩個值之間的最小差異 ,您可以將其視為相同。 例如,如果您認為相隔不到一秒的結果無關緊要,則:

if ((dateB - dateA) < TimeSpan.FromSeconds(1))
{
    // equivalent, within 1s threshold
}
else
{
    // not equivalent or within threshold.
    // you could continue with normal comparison to determine < or > if desired
}

您對(int)(dateB - dateA).TotalSeconds == 0的實現與此幾乎相同,所以是的-這種方法很好。 盡管您可能更喜歡我的實現以提高可讀性並更好地控制閾值,但是您還是應該決定將其更改為其他值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM