【问题标题】:Should i use 23:59:59 or 00:00:00 for 12 AM in 24 hours time format?我应该使用 23:59:59 还是 00:00:00 以 24 小时时间格式表示凌晨 12 点?
【发布时间】:2019-12-02 22:38:00
【问题描述】:

当我搜索最大时间时。人们总是从 VS 调试器中回答这个问题。这是 23:59:59.9999999

因为我需要 24 种格式的 12 AM。我想这将是 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.

毕竟,黑曜石时代根据用例很好地回答了这个问题。

【问题讨论】:

  • 我会avoid using 12 AM and 12 PM altogether to prevent confusion -- 你说的时间是午夜。在可能的情况下,不要依赖“一天中最后可能的时间”,因为(尤其是在使用精度有限的DATETIME 时)您可能会遇到表示该值或对其进行四舍五入的问题。存储这么多 9 需要一个 TIME(7),如果您实际上不需要那么高的精度,那就太浪费了。
  • @Christopher 一分钟几乎总是有 60 秒。在上面的评论中,“驾驶”可能应该是“驾驶”。
  • 奇怪的是,当我使用我的 PC 时钟进行调试时,它显示 00:00:00,但 DateTime.MaxValue 是 23:59:59。我的意思是一天的结束时间是上午 12 点?那有什么问题。我应该用什么?我的意思是正确使用。
  • 那么 23:59:59 是什么时候??
  • 这里甚至被问到什么?它似乎是大约午夜或前一秒,但随后它声称等于12:00:00 PM,这是错误的。它询问带有小数秒和整秒的格式。它似乎与显示给最终用户的格式有关,但随后添加了“特别是在 SQL-Server 中节省时间时”,格式不适用。如果您要显示时间到秒并且时间是11:59:59 PM,那么就显示它;你为什么要把它改成别的东西? 11:59:58 PM 是否也会发生变化,或者阈值在哪里?为什么11:59:59 PM“丑”?

标签: c# .net datetime datetime-format timespan


【解决方案1】:

这取决于视角:

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

所以,一个是一天的结束,另一个是一天的开始。

有一本有趣的小说叫《午夜之间的时间》

【讨论】:

    【解决方案2】:

    从编程上讲,你可以同时做这两个。它们之间的唯一区别(在代码中)是这样的:

     // 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 将完美地读取时间。

    【讨论】:

    • 但是 IDK 为什么要使用时间跨度进行字符串比较?你能在c#中给出一个真实的例子吗
    • 从00:00到00:00比较时,范围应该被视为半开(包括在前面,不包括在最后)。我编辑了您的答案以相应地使用&lt; 而不是&lt;=
    【解决方案3】:

    一些事情:

    • 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 少一个滴答声。

    • 9 有 7 位小数,因为这是数据类型提供的精度。如果您选择较低的精度,则给定值可能会落在它之后的可能性很小(但并非不可能)。因此,当您使用此技术时,请始终将 9 与数据类型的完整精度对齐。 (不要只减去一秒或一毫秒。)

    • 1234563但是,当使用23:59:59.99999999 时,必须考虑丢失的刻度。这可能会变得混乱,因此使用00:00 有一个显着的优势。
    • 正如您所指出的,当向最终用户显示23:59:59.9999999 时,您可能必须编写自己的逻辑将其格式化为24:00"end of day" 等。

      李>
    • 比较日期时间范围时,您需要使用不同的运算符进行结束比较:

      • 如果您使用23:59:59.9999999,请使用完全包含的范围比较:a &lt;= now &amp;&amp; b &gt;= now
      • 如果您使用 00:00,请使用 半开 范围比较 - 开头包含,结尾不包含:a &lt;= now &amp;&amp; b &gt; 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,则应注意所需的编码更改。

    【讨论】:

      【解决方案4】:

      DateTime.MaxValue 正是——DateTime 可以表示的 最大值 值;也就是说,一天中的“最后”一点。相反,.Date 属性默认使用00:00:00,因为它没有时间概念(除非指定)。

      如果您有一个恰好在午夜发生的事件,我建议将其存储为 00:00:00,因为该事件发生在午夜,并且您希望准确地表示它。

      最终,这实际上取决于您想要使用哪个用例。你想说明事件发生在第 1 天的晚上还是第 2 天的开始?这就是它归结为的原因,尽管在绝大多数情况下,这样的划分没有任何区别。在这种情况下,您可能希望同时选择 00:00:00 的准确性和“易用性”。

      【讨论】:

        猜你喜欢
        • 2021-06-11
        • 2014-08-09
        • 1970-01-01
        • 2021-07-05
        • 2015-03-21
        • 2021-09-04
        • 2013-12-06
        • 2023-02-25
        • 2022-01-13
        相关资源
        最近更新 更多