2016-03-01 71 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 

然后,你会得到精度达到你的毫秒。