2012-08-26 437 views
0

如果我編寫一個簡單方法返回曆元時間和DateTime.UtcNow之間的毫秒數,我會得到一個正確的答案。但是,如果我編寫一個方法來返回任意日期和紀元時間之間的毫秒數,則最後三位數字始終爲零。 '一些任意日期'意味着我將DateTime.Parse(「任意日期字符串」)的輸出傳遞給方法。就像我可以做出的那樣,由.Parse返回的DateTime對象不會返回所有有效數字。在任意日期和曆元時間之間取得毫秒

測試方法:

static void GetMillis() 
     { 
      DateTime dUtc = DateTime.UtcNow; 
      DateTime epoch = new DateTime(1970,1,1,0,0,0,DateTimeKind.Utc); 
      double utcmillis = (dUtc - epoch).TotalMilliseconds; 
      String timestamp = dUtc.ToString(); 
      DateTime arbitrary = (DateTime.Parse(timestamp)); 
      Console.WriteLine("Milliseconds between DateTime.UtcNow {0} \nand epoch time {1} are {2}", dUtc, epoch, utcmillis); 
      Console.WriteLine("Milliseconds between arbitrary date {0} \nand epoch time {1} are {2}", arbitrary, epoch, (arbitrary - epoch).TotalMilliseconds); 
     } 

輸出:

C:\src\vs\epochConverter\epochConverter\bin\Debug 
{powem} [54] --> .\epochConverter.exe -debug 
Milliseconds between DateTime.UtcNow 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751385.8 
Milliseconds between arbitrary date 8/26/2012 11:12:31 PM 
and epoch time 1/1/1970 12:00:00 AM are 1346022751000 

我不知道如果我做一些荒唐錯誤或此處沒有理解數學。我在MSDN中進行了研究,找不到任何與此區別有關的內容。我真的希望能夠按照描述計算millis - 是否有可能?

謝謝。

熔點

回答

2

要檢查的中間值:

String timestamp = dUtc.ToString(); 

究竟有什麼回報將取決於您的本地設置,但它會是這樣8/26/2012 11:12:31,這是隻有精確到秒。

解析這當然給了0毫秒的日期時間。

因此,您的毫秒自時代方法在該點上具有零點是正確的。

然而,如果你不喜歡的東西:

arbitrary = new DateTime(2012, 8, 26, 11, 12, 31, 123); 

你會得到這些123毫秒影響的結果。您也可以使用ToStringParseExact,其中包含一秒鐘的小數部分或其他獲取DateTime的其他方法。

總而言之,你的毫秒級以來的時間非常完美,但你得到一個測試日期的方法是有缺陷的。

+0

感謝您的詳細解答。我想這個挑戰是有缺陷的想法。因爲我希望兩個日期之間的毫秒_difference_和任何給定的日期必須可以表示爲毫秒數。但是,我想,那並不是真正發生在DateTime數學上的事情。用例是將演示格式中的日期字符串轉換爲DateTime對象,然後進行處理。我曾看過MSDN文章「如何:在日期和時間值中顯示毫秒數」,但我一直無法爲我工作。 – naugiedoggie

+0

如果用例需要你解析一個字符串,那麼最後的'000'就可能沒問題。這可能只是由於毫秒 - 自1970年以來在某些系統中作爲日期的常見內部表示,並且與此有關。 –

+0

考慮到它後,我相信我已經更好地理解計算日期數學時實際發生的情況。我有一個工具,它應該在_epoch時間內產生數值_但有時候會以毫秒和幾秒鐘的速度被噴出。這顯然是一個錯誤,但對我來說這是一個黑盒子。所有這些問題的結局都是爲了計算這些差異而製作最簡單的工具。我不喜歡做我不瞭解他們如何工作的事情。 ;-) – naugiedoggie

1

默認DateTime.ToString()格式不包括毫秒,這是數據丟失,其中;它發生之前Parse。爲了獲得在字符串表示毫秒,使用自定義格式:

DateTime.UtcNow.ToString() 
// -> 8/26/2012 11:37:24 PM 
DateTime.Parse("8/26/2012 11:37:24 PM").Millisecond 
// -> 0 

DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK") 
// -> 2012-08-26T23:41:17.3085938Z 
DateTime.Parse("2012-08-26T23:41:17.3085938Z").Millisecond 
// -> 308 

The Round-trip ("O", "o") Format Specifier 少打字。或者,在這種情況下,請考慮完全避免轉換:-)

數學是合理的。

0

這裏的數學看起來很合理。不要忘記1秒鐘內有1000毫秒的時間,因此任意時間的計算不包括毫秒與幾乎相同的時間(包括毫秒)之間的誤差爲+/- 1000毫秒。