質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • C#

    9671questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • VB.NET

    1124questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

年齢から西暦を計算したい。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,228

yuki00079

score 43

前提・実現したいこと

タイトル通りですが年齢から計算して求められないかと考えております。(2000年生まれか、1900年台生まれか。)
手元にあるデータ
○年齢(文字列 3桁 前0埋め 025(25歳))
○生年月日(形式 yyMMdd 和暦の年のみ。元号情報なし。900101(1990年01月01日))

上記の情報から生年月日をyyyy/MM/ddの形式に変換したいのですが、年の頭二桁を求めるときに困っております。

発生している問題・エラーメッセージ

下記のコードでは仕様漏れがあり、不正な生年月日に変換される。

該当のソースコード

'パターン①
'下記では西暦の頭部分の19 or 20の判定が甘い。実行日が2016年かつ対象が17歳の場合等。
Console.WriteLine(Date.Now.AddYears(-CInt(info.年齢)).Year.ToString.Substring(0, 2) & Trim(info.生年月日).Substring(0, 2) & "/" & info.生年月日.Substring(2, 2) & "/" & info.生年月日.Substring(4, 2))

'パターン②
'/の挿入方法が違うのは気にしないでください。
'生年月日(yyMMdd)に無理やり"/"を挿入しyy/MM/ddにし、Date.Parseで取得する方法。これでは100歳の方が対象の場合問題がある。
'DateParseでは2000年代ではありえない、(80年代や90年代)の場合は1900年台を返すが、1916年のような方の場合自動的に現代である2000年にて結果を返してくる。(おそらく仕様。)
Console.WriteLine(Date.Parse(info.生年月日.Insert(2, "/").Insert(5, "/")).Year.ToString.Substring(0, 2) & info.生年月日.Substring(0, 2) & "/" & info.生年月日.Substring(2, 2) & "/" & info.生年月日.Substring(4, 2))

詳細

年齢から生年月日の上二桁を取得するのが目的です。(19 or 20)
下二桁のみでの判断では限界があり、(例~20/01/01 の場合1920 or 2020のパターンが考えられる為。)

下二桁と年齢から正しく算出できないでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/11/30 14:33

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+2

年齢が今日現在の物であれば、今日の月日と誕生日の月日の大小比較で、「現在年ー年齢」を補正すればいいかと。

質問文では曖昧ですが、年の下2桁が分かっているなら、00なら2000年だし、99なら1999年だし、そもそも何が問題かよく分からない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/30 15:14

    返信ありがとうございます。
    質問が曖昧で失礼しました。一応修正いたしました。
    >年齢が今日現在の物であれば、
    年齢は最新のデータという認識で誤りないです。
    >今日の月日と誕生日の月日の大小比較で、「現在年ー年齢」を補正すればいい
    具体的にはどのようなロジックになるのでしょうか?。
    >年の下2桁が分かっているなら、00なら2000年だし、99なら1999年だし
    上記は詳細にまとめました。
    お手数おかけしました。

    キャンセル

checkベストアンサー

0

実際に2通り計算すればよいでしょう。

// 生年月日→年齢
// 詳細は以下などでお好みの算出方法を選んでください
// http://dobon.net/vb/dotnet/system/getage.html
static int GetAge(DateTime birthDate, DateTime today)
{
    return    ((today.Year * 10000 + today.Month * 100 + today.Day) -
            (birthDate.Year * 10000 + birthDate.Month * 100 + birthDate.Day)) / 10000;
}

// 西暦2桁の生年月日と年齢→西暦4桁の生年月日
// birth    : "16/01/23"
// today    : 年齢算出日
static String getBirthStr( String birth, int age, DateTime today)
{
    // 1900年代と仮定
    String ret = "19" + birth;
    if( GetAge(DateTime.Parse( ret), today) == age ) {
        return ret;
    }

    // 2000年代と仮定 算出日時以前なら有効な日付
    ret = "20" + birth;
    DateTime dt20 = DateTime.Parse( ret);
    if( dt20 <= today){
        if( GetAge( dt20, today) == age) {
            return ret;
        }
    }
    return "";    // 生年月日と年齢が合わない
}

static void Main( string[] args )
{
    DateTime today = DateTime.Now;
    Console.WriteLine( getBirthStr( "00/11/30", 16, today));
    Console.WriteLine( getBirthStr( "00/11/30", 116, today));
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/30 15:57

    サンプル提供ありがとうございました。
    参考にさせていただきます。

    キャンセル

0

otn さんがおっしゃる通りかと思います。

全然関係ないですが、
年齢計算にはこんな方法もあるので紹介しておきます。
飛べないトナカイ: C# で簡単に年齢計算をおこなう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

otnさんの言う通りです。難しく考え過ぎているのでは?
今日がその人の今年の誕生日前なら今現在の年齢+1を引き、誕生日後なら今現在の年齢を引けばよいです。
例えば、本日(11月30日)に17歳の人がいたとします。
12月1日生まれなら、2016-(17+1)=1998年の12月1日生まれ。
11月30日生まれなら、2016-17=1999年の11月30日生まれ。
(誕生日の午前0時に歳をとるとします。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9671questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • VB.NET

    1124questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。