如何区分DateTime,日期和时间

时间:2014-08-29 03:41:05

标签: c#

日期和时间有三种样式可以进入DateTime变量;日期时间,日期或时间。我想区分它们。我怎么能这样做?

我正在DataGrid上创建列过滤。根据它是否为三者之一,过滤器将显示DateTime选择器或DatePicker或时间选择器。

3 个答案:

答案 0 :(得分:1)

检查DateTime是否具有日期值的唯一方法是使其成为可以为空的类型。

这样的事情:

DateTime? dt;

if(dt.HasValue) {
 //has date
 if(dt.Value.TimeOfDay.TotalSeconds == 0) {
   // display datepicker
 } else {
   // display timepicker
 }
} else {

// show date time picker
}

除此之外,常规DateTime将始终具有日期值(如果不是时间值,或两者都有)。那是因为它是一个结构体,因此它不可为空,除非你“制造”它(通过包装在Nullable中,通过手动(Nullable<DateTime>)或更简单地完成 - 通过将?附加到如上所示输入(DateTime?)。

如果您可以选择使用不同的数据类型(DateTime除外),那么我建议查看NodaTime(Microsoft应该简单地将其构建到CLR并删除它们的蹩脚DateTime结构)。

您可以拥有3个可空属性

LocalDate? Date;
LocalDateTime? DateTime;
LocalTime? Time;

因此,基于哪个道具有价值,您会显示适当的控制。当然,你还需要设置适当的属性,我不确定你是否有任何控制权。

答案 1 :(得分:1)

此分类不是结构的一部分。 IOW没有内置的方法可以做到这一点,所以您可以选择自己喜欢的实现。

有人建议检查可能满足你的TotalSeconds == 0是否是一个很好的解决方案,但我认为它应该谨慎使用,因为它是有限的。因为如果您希望时间+日期指向真正TotalSeconds == 0的日期,那该怎么办呢?这种方法会自动将其转换为日期。

我建议如果你不把这个时间与日期联系起来,选择TimeSpan让你的生活变得更加轻松。但我认为情况并非如此。

所以,如果时间确实与日期相关联,我建议你只需创建一个包含DateTime的自己的类型,再加上一个能回答你问题的布尔标志:它只是一个日期或日期+时间?
这是显而易见的,但无论如何我必须这样说:如果你采取这种方法 - 封装&amp;隐藏!
如果您将DateTime作为字段公开,则最终用户可能会更改日期的时间,期望它成为日期+时间,但该标记将不会跟随。所以,不要只创建一个包装器,制作自己的类型,只在内部使用DateTime

答案 2 :(得分:1)

没有绝对的方法可以区分。 DateTime始终具有日期部分和时间部分。如果您仅从日期创建DateTime,则时间部分将归零至午夜,但该值与实际表示该日期午夜行程的值之间没有差异。如果您从一次创建DateTime,那么日期部分将等于#1/01/0001#,但是它与实际表示新的第一天的时间之间的值没有区别时代。

一种选择是假设具有非零时间和日期#1/01/0001#的DateTime仅表示时间,具有零时间部分的值仅表示日期。考虑到这一点,您可以添加此扩展名:

public enum DateTimeType
{
    Date,
    Time,
    DateAndTime
}

public static class DateTimeExtensions
{
    private static readonly DateTime ZeroDate = new DateTime(1, 1, 1);

    public static DateTimeType GetDateTimeType(this DateTime value)
    {
        if (value.TimeOfDay == TimeSpan.Zero)
        {
            return DateTimeType.Date;
        }

        if (value.Date == ZeroDate)
        {
            return DateTimeType.Time;
        }

        return DateTimeType.DateAndTime;
    }
}