Why does TimeSpan not have a Years property?

Programmer's life is really hard.

The length of year is variable. Some years have 365 days and some have 366 days. According to the calendar, some years could even have missing days. If talking about culture it becomes more difficult since Chinese lunar calendar can have 13 months a year.

The length of month is variable, and this is well-known. This is also to know that in other calendars things can get worse.

The length of day is variable, because of daylight savings and this is not just culture dependent but also geography dependent.

The length of hour and minute are variable, because of leap seconds.

It seems the only thing that is reliable is the length of a second. So internally, timespan is stored in seconds (or milliseconds, which is the same).

But the variability of time units makes the answer "how many (years/months/days/hours/minites) for n seconds?" being always inaccurate.

This is why the developers end up with a solution that is useful in practical but not precise. They simply ignore daylight savings and leap seconds. However, since people hardly ask about years and months, they just decided not to answer those questions.


A TimeSpan only contains the difference between two DateTime values. It is unknown which year this TimeSpan is in. That's also why it doesn't have a Months property.

Example:

TimeSpan.FromDays(60)

How many months are that? 1 or 2?


The absence of Months made sense since there is no standard month length.

There is no standard year length either because of leap years.

Workaround: If you really want to display an approximate value, then doing TimeSpan.TotalDays / 365.2425 will do just fine.

Edit: But only for rough estimations and not for birthdays. In birthday calculation, leap days will accumulate every 4 years as pointed out by Henk Holterman in the comments. Take a look here for calculation of birthdays.