当我搜索最大时间时。人们总是从VS调试器得到答案。这是23:59:59.9999999
因为我需要12 AM,24种格式。我想它将是00:00:00,但是... C#.NET假定以下条件:
var xx = DateTime.MaxValue.ToString("HH:mm:ss.fffffff");
在调试之前,它将打印 23:59:59.9999999
我应该使用什么?有关系吗?有什么区别?
应该使用 00:00:00 吗?或 23:59:59.9999999 在SQL Server中保存时间。
大问题或我的意思是,当您通过 hh:mm:ss 将24种格式转换为12小时格式时,最终用户的行为不佳,它将显示11:59:59 PM
是不是很丑?应该是12:00:00 AM.
毕竟,黑曜石时代根据使用情况回答了这一问题。
答案 0 :(得分:3)
这取决于视角:
var xx = DateTime.MaxValue.ToString("HH:mm:ss.fffffff");
var xy = DateTime.MinValue.ToString("HH:mm:ss.fffffff");
给予
23:59:59.9999999
00:00:00.0000000
所以,一个是一天的结束,另一个是一天的开始。
有一本有趣的小说叫《午夜之间的时间》
答案 1 :(得分:1)
DateTime.MaxValue
就是-DateTime
可以表示的 maximum 值;也就是说,一天中的“最后”时刻。相反,.Date
属性默认情况下使用00:00:00
,因为它没有时间概念(除非指定)。
如果您有一个恰好在午夜发生的事件,我建议将其存储为00:00:00
,因为该事件发生在午夜 ,并且您希望准确地表示出来。
最终,这实际上取决于您要使用的用例。您是否要声明该事件发生在第一天的晚上或第二天的开始?归根结底,尽管在大多数情况下,这样的划分没有什么区别。在这种情况下,您可能希望选择00:00:00
的准确性和“易用性”。
答案 2 :(得分:0)
以编程方式来说,您可以同时进行。它们之间(代码中)的唯一区别是:
// using 00:00:00 will require you to add 1 day to the end date in order to count as full day
if(time >= "2019-12-03 00:00:00" && time < "2019-12-04 00:00:00")
//using 23:59:59 will not require you to add 1 day to the end date.
if(time >= "2019-12-03 00:00:00" && time <= "2019-12-03 23:59:59")
因此,基本上,如果您使用23:59:59
,那么离网格还有一秒钟的时间,如果在这一秒中已存储了任何记录,则该记录将不包含在结果中。而第二个将包括它。
使用哪个? 00:00:00
当然可以,如果您想更加精确,我在我的项目中没有看到任何结果差异,因为我在不同的项目中都使用了它们。但是我确定有些项目需要包含每微秒,因为此微秒可能会改变结果的曲线(例如分析或深度学习等)。
在SQL Server中,不要将时间另存为字符串,而是使用正确的数据类型(DateTime,TimeSpan ..etc)进行保存。当您从应用程序传递一个对应的时间数据类型时,SQL Server会很好地读取时间。
答案 3 :(得分:0)
几件事:
C#中DateTime
可以表示的最大值为9999-12-31 23:59:59.9999999
。在SQL Server中,这对应于一个datetime2
,具有相同的最大值。
SQL Server中的time
类型的最大值也为23:59:59.9999999
(尽管请注意,C#TimeSpan
可以更大,因为它主要表示持续时间而不是时间)的一天)。
如果您仅使用time
类型存储时间范围,则一天结束时需要该23:59:59.9999999
值。您可以使用DateTime.MaxValue.TimeOfDay
在C#中快速获取。实际上,它将比真正的24:00
小一刻。
有7个9的小数,因为这是数据类型提供的精度。如果选择较低的精度,则给定值可能会落在该值上的可能性很小(但并非不可能)。因此,当您使用此技术时,请始终使9与数据类型的全精度对齐。 (不要只减去一秒或一毫秒。)
在计算2020-01-01 00:00
与2020-01-01 01:00
之类的日期时间范围的差异时,只需将两个值相减即可得出结果(在这种情况下为1小时)。但是,在使用23:59:59.99999999
时,必须解决丢失的滴答声。这可能会变得凌乱,因此使用00:00
会有很大的优势。
正如您所指出的,向最终用户显示23:59:59.9999999
时,您可能必须编写自己的逻辑以将其格式化为24:00
或"end of day"
等。
比较日期时间范围时,您需要使用其他运算符进行结束比较:
23:59:59.9999999
,请使用完全包含的范围比较:a <= now && b >= now
00:00
,请使用半开范围比较-在开始处包括范围,在结束处包括范围:a <= now && b > now
在比较仅时间范围(即timspan类型)时,采用相同的逻辑,但还必须考虑跨越午夜的时间范围:
如果您使用23:59:59.9999999
:
if (a < b)
result = a <= now && b >= now;
else
result = a <= now || b >= now;
如果您使用00:00
:
if (a < b)
result = a <= now && b > now;
else
result = a <= now || b > now;
总而言之,使用00:00
值而不是23:59:59.9999999
值通常更简单,因此您应该选择00:00
。如果发现需要使用23:59:59.9999999
,则应了解所需的编码更改。