将以毫秒为单位的差异转换为.MaxValue返回日期/时间

时间:2016-03-01 09:57:28

标签: c# datetime azure timestamp

对于Azure TableStorage上的rowkey,使用了前缀后面的实体:

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

据我所知,这个timestamp应该作为一种“分类器”,以便更新的实体位于列表之上。因此,这个显示的代码行创建(我可以想象)当前日期/时间到DateTime.MaxValue的毫秒数。

是否有一种简单而安全的方法,将这个毫秒“返回”转换为创建timestamp的日期/时间?我对日期/时间转换不太熟悉......

1 个答案:

答案 0 :(得分:1)

DateTime.MaxValue是:

  

相当于23:59:59.9999999 UTC,9999年12月31日   阳历,正好在00:00:00之前100纳秒   UTC,1月1日,10000。

因此,考虑到大约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

然后你将获得精确到毫秒。