【问题标题】:Strategy for Incomplete Dates不完整日期的策略
【发布时间】:2010-11-29 05:51:53
【问题描述】:

在我们希望用户能够输入不完整日期的应用程序上工作。

在某些情况下,只有一年 - 例如 1854 年,或者可能有一年和一个月,例如 1983 年 3 月,或者可能有一个完整的日期 - 2001 年 6 月 11 日。

我们想要一个“日期”属性/列 - 并且能够按日期排序。

有什么建议吗?

【问题讨论】:

  • 如果一个用户输入“1854”,另一个用户输入“2PM 1854”,我们按日期降序排序,哪个会先出现?
  • 你应该支持的最低年份值是多少?

标签: c# asp.net-mvc datetime


【解决方案1】:

将日期存储为整数 -- yyyymmdd。

然后您可以将尚未输入的任何月份或日期部分归零

Year only: 1954 => 19540000
Year & Month: April 2004 => 20040400
January 1st, 2011 => 20110101

当然,我假设您不需要存储一天中的任何时间信息。

然后您可以创建一个结构来封装此逻辑,并使用有用的属性指示已设置的粒度级别、相关的 System.DateTime 等

编辑:排序应该也能正常工作

【讨论】:

    【解决方案2】:

    我想不出使用单个日期字段的好方法。

    如果您像其他人建议的那样使用一月作为默认月份并使用 1 作为默认日期,您会遇到一个问题,当他们实际选择一月时会发生什么?您将如何跟踪它是选定的一月还是默认的一月。

    我认为您将不得不存储一个面具和日期。 您只需要日期的每个部分,这将是 6 位数据。

    M|D|Y|H|Min|S

    仅一个月 1|0|0|0|0|0 = 32

    仅年份 0|0|1|0|0|0 = 8

    月+年 1|0|1|0|0|0 = 40

    AllButMinSec 1|1|1|1|0|0 = 60

    您可以将其放入一个标志枚举中,以使其更易于在代码中使用。

    【讨论】:

      【解决方案3】:

      嗯,你可以通过一个单独的列和字段来完成,上面写着“IsDateComplete”。

      如果您只有有日期字段,那么您需要对日期格式本身的“不完整性”进行编码,这样如果日期是,比如说,

      就我个人而言,我会选择旁边的一个字段,这就是它的标志。更容易遵循,更容易做出决定,并允许任何日期。

      不用说,也许您可​​以从 DateTime.MinValue 创建一个日期,然后设置您“知道”的内容。

      当然,我的方法不允许你“知道”你不知道的东西。 (也就是说,你不知道他们已经设置了月份)。您也许可以使用日期格式说明符来掩盖它,并将其存储在一起,但它可能会变得很麻烦。

      无论如何,给你一些想法。

      【讨论】:

        【解决方案4】:

        一个选项是使用一月作为默认月份,1 作为默认日期,1900 或类似的东西作为默认年份。不完整的日期将被这些默认值填充,不完整的日期将排在同一年的完整日期之前。

        另一个稍微复杂一点的选项是使用 -1 作为默认日期和年份,使用 -1、“NoMonth”或默认月份等。如上所述填写不完整的日期。根据您的操作方式,这可能会使排序有点困难,但它可以让您判断日期的哪些部分是有效的。

        【讨论】:

          【解决方案5】:

          我知道你宁愿有 1 列,但是,总是可以有一个单独的列来表示日、月和年,而不是单列。对它进行查询并不是很困难,并且它总是任何组件为空。

          Smehow 在日期时间本身对这些状态进行编码将更难查询。

          【讨论】:

            【解决方案6】:

            我上次解决此问题时所做的是创建一个自定义日期类型,用于跟踪实际设置的日期部分并提供与 DateTime 的转换。为了在数据库中存储,我使用了一个日期字段,然后使用了一个布尔值/位来跟踪用户实际设置的日期组件。

            【讨论】:

              猜你喜欢
              • 2014-08-15
              • 1970-01-01
              • 2019-12-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多