日期和时间有三种样式可以进入DateTime变量;日期时间,日期或时间。我想区分它们。我怎么能这样做?
我正在DataGrid上创建列过滤。根据它是否为三者之一,过滤器将显示DateTime选择器或DatePicker或时间选择器。
答案 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;
}
}