Convert duration to years?

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jan 15 03:02:12 PST 2017


On 01/15/2017 07:58 AM, Nestor wrote:
> I eventually came up with this, but it seems an ugly hack:
>
> import std.stdio;
>
> uint getAge(int yyyy, ubyte mm, ubyte dd) {
>   ubyte correction;
>   import std.datetime;
>   SysTime t = Clock.currTime();
>   if (t.month < mm) correction = 1;
>   else if (t.month == mm) correction = (t.day < dd) ? 1 : 0;
>   else correction = 0;
>   return (t.year - yyyy - correction);
> }
>
> void main() {
>   try
>     writefln("Edad: %s aƱos.", getAge(1958, 1, 21));
>   catch(Exception e) {
>     writefln("%s.\n(%s, line %s)", e.msg, e.file, e.line);
>   }
> }

That's the better approach, I think. Years have variable lengths. 
Determining "age" in years works by comparing dates, not durations.

I would write it like this, but as far as I see yours does the same thing:

----
int getAge(int yyyy, int mm, int dd)
{
     import std.datetime;

     immutable SysTime now = Clock.currTime();
     immutable int years = now.year - yyyy;

     return mm > now.month || mm == now.month && dd > now.day
         ? years - 1 // birthday hasn't come yet this year
         : years; // birthday has already been this year
}

void main()
{
     import std.stdio;

     /* Day of writing: 2017-01-15 */
     writeln(getAge(1980, 1, 1)); /* 37 */
     writeln(getAge(1980, 1, 15)); /* 37 (birthday is today) */
     writeln(getAge(1980, 1, 30)); /* 36 */
     writeln(getAge(1980, 6, 1)); /* 36 */
}
----

> Isn't there a built-in function to do this?

If there is, finding it in std.datetime would take me longer than 
writing it myself.


More information about the Digitalmars-d-learn mailing list