none
年齢をもとめる RRS feed

  • 質問

  • お世話になっております。

    年齢を求める方法を考えており、次の方法で対応しようと思っていたのですが、うるう年じゃないときにひっかてしまい、
    対策を考えております。下記のコマンドをみてご教授お願いします。

    条件:誕生日の前日をもって年齢を+1する
        ex.1/1生まれ ~12/31 = 1歳とする

    閏年の場合
    > ([datetime]((New-TimeSpan $([datetime]"1999/3/1") $([datetime]"2000/2/29")).ticks)).year -1
    >1

    閏年ではない場合
    > ([datetime]((New-TimeSpan $([datetime]"2002/3/1") $([datetime]"2003/2/28")).ticks)).year -1
    >0 0となってしまう。

    ご教授お願いします。



    2009年10月19日 2:19

回答

  • New-TimeSpanでどのようにして良いかわからず、下記のような関数を作ってみました。

    function Get-Age([DateTime]$Birthday, [DateTime]$Today = [DateTime]::Now)
    {
        #数え年を計算
        $Year = $Today.Year - $Birthday.Year
        #今年の誕生日を計算(誕生日の前日を求める)
        $ThisBirthday = $Birthday.AddYears($Year).AddDays(-1)
        #今日が誕生日の前日より前なら数え年から1引く
        if ($Today -lt $ThisBirthday )
        {
            $Year-=1
        }
        return $Year
    }

    この関数は

    Get-Age "誕生日" "基準日"

    として使用します。
    たとえば

    Get-Age "1999/3/1" "2000/2/29"

    のように。

    ここでいう基準日は、○月X日時点で何歳かを調べるための日付を意味します。
    基準日は省略することができ、省略した場合は"今日"を指定したことになります。

    この関数を使用して、
    閏年の場合1999/3/1~2000/2/29を計算すると、1
    閏年ではない場合2002/3/1~2003/2/28を計算すると、1
    となります。

    *誕生日の求め方はいろいろとあるようですが、ここでは「条件:誕生日の前日をもって年齢を+1する」に従って計算しています。
    コードに関して、おかしな部分がありましたらご指摘願います
    • 編集済み HIROsDotNetMVP 2009年10月20日 8:46 文章追記
    • 回答としてマーク TAKAKUN 2009年10月23日 6:22
    2009年10月20日 8:44

すべての返信

  • New-TimeSpanでどのようにして良いかわからず、下記のような関数を作ってみました。

    function Get-Age([DateTime]$Birthday, [DateTime]$Today = [DateTime]::Now)
    {
        #数え年を計算
        $Year = $Today.Year - $Birthday.Year
        #今年の誕生日を計算(誕生日の前日を求める)
        $ThisBirthday = $Birthday.AddYears($Year).AddDays(-1)
        #今日が誕生日の前日より前なら数え年から1引く
        if ($Today -lt $ThisBirthday )
        {
            $Year-=1
        }
        return $Year
    }

    この関数は

    Get-Age "誕生日" "基準日"

    として使用します。
    たとえば

    Get-Age "1999/3/1" "2000/2/29"

    のように。

    ここでいう基準日は、○月X日時点で何歳かを調べるための日付を意味します。
    基準日は省略することができ、省略した場合は"今日"を指定したことになります。

    この関数を使用して、
    閏年の場合1999/3/1~2000/2/29を計算すると、1
    閏年ではない場合2002/3/1~2003/2/28を計算すると、1
    となります。

    *誕生日の求め方はいろいろとあるようですが、ここでは「条件:誕生日の前日をもって年齢を+1する」に従って計算しています。
    コードに関して、おかしな部分がありましたらご指摘願います
    • 編集済み HIROsDotNetMVP 2009年10月20日 8:46 文章追記
    • 回答としてマーク TAKAKUN 2009年10月23日 6:22
    2009年10月20日 8:44
  • ご返事遅くなり、申し訳ございません。
    ありがとうございます。



    参考にさせていただきます。
    なかなか、標準実装ではムヅカシイものがあります。

    ありがとうございました。

    2009年10月23日 6:22