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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

VB.NET

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

Q&A

解決済

4回答

6045閲覧

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

yuki00079

総合スコア45

C#

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

VB.NET

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

0グッド

0クリップ

投稿2016/11/30 04:54

編集2016/11/30 06:03

###前提・実現したいこと
タイトル通りですが年齢から計算して求められないかと考えております。(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のパターンが考えられる為。)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

投稿2016/11/30 05:42

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/11/30 06:14

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

0

こんにちは。

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

投稿2016/11/30 06:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

C#

1// 生年月日→年齢 2// 詳細は以下などでお好みの算出方法を選んでください 3// http://dobon.net/vb/dotnet/system/getage.html 4static int GetAge(DateTime birthDate, DateTime today) 5{ 6 return ((today.Year * 10000 + today.Month * 100 + today.Day) - 7 (birthDate.Year * 10000 + birthDate.Month * 100 + birthDate.Day)) / 10000; 8} 9 10// 西暦2桁の生年月日と年齢→西暦4桁の生年月日 11// birth : "16/01/23" 12// today : 年齢算出日 13static String getBirthStr( String birth, int age, DateTime today) 14{ 15 // 1900年代と仮定 16 String ret = "19" + birth; 17 if( GetAge(DateTime.Parse( ret), today) == age ) { 18 return ret; 19 } 20 21 // 2000年代と仮定 算出日時以前なら有効な日付 22 ret = "20" + birth; 23 DateTime dt20 = DateTime.Parse( ret); 24 if( dt20 <= today){ 25 if( GetAge( dt20, today) == age) { 26 return ret; 27 } 28 } 29 return ""; // 生年月日と年齢が合わない 30} 31 32static void Main( string[] args ) 33{ 34 DateTime today = DateTime.Now; 35 Console.WriteLine( getBirthStr( "00/11/30", 16, today)); 36 Console.WriteLine( getBirthStr( "00/11/30", 116, today)); 37}

投稿2016/11/30 06:08

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/11/30 06:57

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

0

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

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

投稿2016/11/30 06:00

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問