不完全日期的策略

时间:2010-11-29 05:51:53

标签: c# asp.net-mvc datetime

处理我们希望用户能够输入不完整日期的应用程序。

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

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

有什么建议吗?

6 个答案:

答案 0 :(得分:8)

将日期存储为整数 - yyyymmdd。

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

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

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

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

编辑:排序应该很好地工作

答案 1 :(得分:1)

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

如果您将1月用作默认月份,而将1作为默认日期,则会出现问题,就像其他人建议的那样,当他们实际选择1月时会发生什么?如果它是选定的1月份或默认的1月份,您将如何跟踪。

我认为你必须存放一个面具和日期。 你只需要每个部分的日期,只有6位数据。

M | d | Y | H |闵| 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

您可以将其放入Flag Enum中,以便在代码中使用它。

答案 2 :(得分:0)

嗯,你可以通过一个名为'IsDateComplete'的列和字段来完成。

如果具有日期字段,那么您需要在日期格式本身中对“不完整性”进行编码,例如,如果日期是,则< 1900年,它被认为是“不完整”。

就个人而言,我会选择旁边的一个场地,这样就可以了。更容易理解,更容易做出决定,并允许任何日期。

不言而喻,您可以从DateTime.MinValue创建日期,然后设置您“知道”的内容。

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

无论如何,对你有些想法。

答案 3 :(得分:0)

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

另一个稍微复杂的选项是使用-1表示默认的日期和年份,-1表示“NoMonth”,或者某些例如默认月份。填写不完整的日期如上。根据您的操作方式,这可能会使排序变得有点困难,但它可以让您了解日期的哪些部分有效。

答案 4 :(得分:0)

我知道你宁愿拥有一列,但是,不是一列,而是每天,每月和每年都可以有一个单独的列。对查询进行查询并不困难,而且任何组件都是null。

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

答案 5 :(得分:0)

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