【发布时间】:2015-05-05 17:15:32
【问题描述】:
我正在编写一个转换器,它可以获取一个人的出生日期并以年为单位计算他们的年龄。我写了一些看起来像这样的东西:
public class DateOfBirthToAgeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var date = value as DateTime?;
if (date == null) return null;
return (DateTime.Now - date).Years;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我发现TimeSpan 上没有Years 属性,这是两个DateTime 对象相减的结果。我对此感到有些惊讶。我想过为什么可能没有Years。我认为这可能是因为闰日,但按照这种逻辑,由于夏令时,不应该有Days。
没有Months 是有道理的,因为没有标准的月份长度。
我能够编写一些不同的代码来获得正确的年龄,但我仍然很想知道为什么TimeSpan 上没有Years 或Weeks 属性。 有人知道原因吗?
【问题讨论】:
-
“为什么 X 没有 Y”通常不是最好的问题。您已经提到了准确定义一年的困难。
-
即使由于夏令时两个日期之间的差异可能是 23 小时或 25 小时,但作为持续时间的“天”仍然具有 24 小时的固定定义。
-
值得查看由 Jon Skeet 维护的 NodaTime 库。它是比内置的 DateTime 和 Timespan 类强得多的抽象。来自《马口》:blog.nodatime.org/2011/08/what-wrong-with-datetime-anyway.html
-
@Izkata - 不,
21st July的持续时间会更改(日历的属性)。a day的持续时间不(时间单位)。 -
@EarthEngine 一个“SI 日”IS 86400 秒。 “公民日”可以是 86400 +/- 1 秒。但我们不以民用单位计量时间,我们使用国际单位制。