2016-03-01 98 views
0

有關Azure中的rowkey使用TableStorage實體如下前綴:轉換差.MaxValue返回日期/時間

DateTime.MaxValue.Subtract(DateTime.UtcNow).TotalMilliseconds 

據我所知,這應該行動timestamp作爲一種「分揀」的以便新的實體位於列表之上。所以,這段代碼行會創建(如我所能想象的)當前日期/時間的毫秒數量,直到DateTime.MaxValue

是否有一個簡單而安全的方法,將此毫秒量「回」轉換爲創建timestamp時的日期/時間?我可不是那麼熟悉日期/時間轉換...

+0

我會保持簡單:是否有沒有使用DateTime.UctNow的原因?它將與DateTime.MaxValue中毫秒的差異一樣排序 –

回答

1

DateTime.MaxValue是:

相當於23:59:59.9999999 UTC,9999年12月31日,在 公曆,只有一個100 -nanosecond前打勾00:00:00 UTC ,10000年1月1

因此,考慮大致萬年,您有:

10,000 x 365 x 24 x 60 x 60 x 1000 = 315,360,000,000,000 //Note 15-digit 

double精度至少爲15位。換句話說,只要您使用TotalMilliseconds的前15位數字作爲時間戳,那麼它應該沒問題。

我建議把它轉換爲long其整精度爲:

–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 //note, more than 15-digit 

然後用ToString("D15")作爲唯一的時間戳:

long val = (long)DateTime.MaxValue.Subtract(DateTime.UtcNow).TotalMilliseconds; 
string timestamp = val.ToString("D15"); 

和轉換回,​​你可以將它轉換回double並使用AddMilliseconds以及來自最大值的負號。

double db = Convert.ToDouble(timestamp); 
DateTime dt = DateTime.MaxValue; 
dt.AddMilliseconds(-db); //this will give you the datetime back with milliseconds precision 

然後,你會得到精度達到你的毫秒。