将以毫秒为单位的差值转换为 .最大值返回到日期/时间

本文关键字:返回 最大值 日期 时间 转换 为单位 | 更新日期: 2023-09-27 18:36:47

对于 Azure TableStorage实体上的行键,使用以下前缀:

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

据我所知,这timestamp应该充当一种"分类器",以便较新的实体位于列表的顶部。因此,显示的此代码行创建(我可以想象)当前日期/时间的毫秒数,直到DateTime.MaxValue

有没有一种简单而安全的方法,将这种毫秒数"转换回"到创建timestamp的日期/时间?我对日期/时间转换不太熟悉...

将以毫秒为单位的差值转换为 .最大值返回到日期/时间

DateTime.MaxValue 是:

相当于 9999 年 12 月 31 日 23:59:59.9999999 UTC 公历,正好在 00:00:00 之前有一个 100 纳秒的刻度 UTC,10000 年 1 月 1 日。

因此,考虑到大约 10,000 年,您有:

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

双精度至少为 15 位。换句话说,只要您使用TotalMilliseconds的前 15 位数字作为时间戳,那么它应该没问题。

我建议将其转换为整数精度为:

–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 并使用带有 max 负号的AddMilliseconds

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

然后,您将获得高达毫秒的精度。