为什么TimeSpan没有Age属性?

Owe*_*son 11 c# datetime timespan

我正在写一个转换器,它取一个人的出生日期并生成他们的年龄.我写了一些看起来像这样的东西:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现除了两个对象之外没有任何Years属性.我对此感到有些惊讶.我想到为什么可能没有.我认为这可能是因为闰日,但按照这个逻辑,不应该因为夏令时.TimeSpanDateTimeYearsDays

没有Months明确的意义,因为没有标准的月份长度.

我能够编写一些不同的代码来获得正确的年龄,但我仍然真的想知道为什么没有Years或Weeks属性TimeSpan.有谁知道原因?

byt*_*e77 10

A TimeSpan仅包含两个值之间的差异DateTime.不知道这是哪一年TimeSpan.这也是它没有Months财产的原因.

例:

TimeSpan.FromDays(60)
Run Code Online (Sandbox Code Playgroud)

那几个月了?1还是2?


缺少月份是有道理的,因为没有标准月份长度.

由于闰年,没有标准的年份长度.

解决方法:如果你真的想要显示一个近似值,那么做TimeSpan.TotalDays / 365就好了.

编辑:但仅适用于粗略估计而非生日.在birhtday计算中,Henk Holterman在评论中指出,闰日将每4年累积一次.看看这里计算birhtdays.

  • 我所说的“大约”是指“用户 X 在 StackOverflow 上呆了 7 年”。在这种情况下,这很好。对于生日(年龄)来说可能不是,但无论如何我想指出这一点。 (2认同)

Ear*_*ine 7

程序员的生活真的很难.

年份的长短是多变的.有些年头有365几天,有些有366几天.根据日程表,有些年份甚至可能缺少日子.如果谈论文化,由于中国农历一年可以有13个月,因此变得更加困难.

月份的长度是可变的,这是众所周知的.这也是要知道在其他日历中事情会变得更糟.

由于夏令时,一天的长度是可变的,这不仅取决于文化,还取决于地理.

由于闰秒 s ,小时和分钟的长度是可变的.

似乎唯一可靠的是一秒钟的长度.因此在内部,时间跨度以秒(或毫秒,相同)存储.

但是时间单位的变化使得答案是" n几秒钟(年/月/日/小时/分钟)?" 永远不准确.

这就是为什么开发人员最终会得到一个实用但不精确的解决方案.他们完全忽略了夏令时和闰秒.然而,由于人们几乎不会问几年和几个月,他们只是决定不回答这些问题.


spe*_*der 6

反问句:如果没有参照物,一年有多长?

由于 TimeSpan 没有固定的时间点,因此无法明确说出未知时间的一年有多长。在最简单的情况下,可能是 365 或 366 天。影响结果的案例要多得多。

  • 根据维基百科,它是 365.2425。 (2认同)