2016-05-08 25 views
-1

我創建了一個獲取Unix時間戳的簡單類。第一次調用它會返回時間戳,但在此之後它總是返回它第一次返回的值,就像它已經被緩存了一樣。Timestamp.UTCNow不是最新的

這是怎麼回事?

using System; 
using System.Collections; 

public class Timestamp {  
    public static float now { 
     get { 
      return (float)(DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds; 
     } 
    }  
} 

Timestamp.now總是返回相同的值

編輯:

using UnityEngine; 
using System; 
using System.Collections; 


    public static float now { 
     get { 
      Debug.Log(DateTime.UtcNow); // 1 
      Debug.Log(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))); // 2 
      float ts = (float)(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))).TotalSeconds; 
      Debug.Log(ts.ToString("F")); // 3 
      return ts; 
     } 
    } 

} 

1)印刷2016年5月8日下午11時44分57秒在第一次調用,和第5/8/2016 11:45:05 PM在第二個電話,所以它是最新的

2)在第一個電話打印16929.23:44:57.2918073和在第二個電話打印16929.23:45:05.9735794,所以它是最新的

3)總是打印1462751000.00

+0

DateTime.UtcNow方法'Subract'返回一個'TimeSpan',你將它轉換爲'float',這是不正確的。 – t0mm13b

+0

爲什麼你將結果轉換爲「float」? –

+0

@ t0mm13b正在投射'TotalSeconds'屬性的值,其類型爲'double',可以轉換爲'float'。 – hvd

回答

0

的問題(如在由@PetSerAl評論中指出)是float具有精度太有限。

觀察:

var nowAsDouble = (DateTime.UtcNow.Subtract(new DateTime (1970, 1, 1))).TotalSeconds; 
var nowAsFloat = (float)nowAsDouble; 

Console.WriteLine("double: " + nowAsDouble.ToString("0.0")); 
Console.WriteLine("float: " + nowAsFloat.ToString("0.0")); 

輸出:

double: 1462751469.2 
float: 1462751000.0 

如果運行幾次,你會看到雙版本每次都改變,其中浮點值總是截斷。您需要使用double值而不是float

+0

好了,現在我明白了!最好是採用double並最終轉換它到int(我實際上現在這樣做)比轉換爲浮點數,因爲它失去了浮點分辨率。 – Pixel

0

嘗試此

public static int now { 
     get { 
      return (int)(DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1))).TotalSeconds; 
     } 
    } 
+0

他鑄造了TotalSeconds,它是一個雙倍,所以它可以被鑄造爲浮動 – Gusman

+0

你們在投票前試過了,試試看,並檢查在http://www.onlineconversion.com/unix_time.htm – wael101

+1

的價值相當傷心,當唯一的正確答案downvoted所以很重要的是,Unix時間戳確實是* int *。對人來說,不要假設OP知道他在做什麼,他不知道 –

相關問題