我有一个DateTime
表示为长(8 个字节),来自DateTime.ToBinary()
,我们称之为dateTimeBin
。是否有一种最佳方法可以删除时间信息(我只关心日期),以便我可以将其与一天的开始进行比较?假设我们将此样本值作为一天的开始。
DateTime startOfDay = new DateTime(2020,3,4,0,0,0);
long startOfDayBin = startOfDay.ToBinary();
我显然知道我总是可以转换为DateTime
对象然后获取日期组件。然而,这个操作将发生数十亿次,每一个小的性能调整都会有所帮助。
- 有没有一种有效的方法来提取日期信息
dateTimeBin
而不将其转换为DateTime
?或任何算术运算long
那只会返回日期?
- 有没有办法匹配
startOfDay
(or startOfDayBin
) and dateTimeBin
它们是否具有相同的日期组件?
- 有办法看到吗
if (dateTimeBin >= startOfDayBin)
,我不认为long
比较有效。
注意:所有日期均为 UTC
由于您仅使用 UTC 日期 - 使用是有意义的DateTime.Ticks
代替DateTime.ToBinary
,因为前者有相对明确的含义 - 自纪元以来的刻度数,就像unix时间一样,唯一的区别是unix时间间隔是秒而不是刻度(其中刻度是秒的1/10.000.000),而纪元是午夜0001 年 1 月 1 日,而不是 1970 年。ToBinary
只承诺可以恢复原样DateTime
价值回归,仅此而已。
使用刻度可以轻松提取时间和日期。要提取时间,您需要将滴答声除以一整天的滴答声数量得到余数,因此
long binTicks = myDateTime.Ticks;
long ticksInDay = 24L * 60 * 60 * 10_000_000;
long time = binTicks % ticksInDay;
然后您可以使用将其转换为TimeSpan
:
var ts = TimeSpan.FromTicks(time);
为了方便起见,或按原样使用。与仅提取日期相同:只需减去时间
long date = binTicks - (binTicks % ticksInDay);
常规比较(dateTimeBin >= startOfDayBin
) 对于刻度值也有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)