質問: ### 前提・実現したいこと タイトル通りですが年齢から計算して求められないかと考えております。(2000年生まれか、1900年台生まれか。) 手元にあるデータ ○年齢(文字列 3桁 前0埋め 025(25歳)) ○生年月日(形式 yyMMdd 和暦の年のみ。元号情報なし。900101(1990年01月01日)) 上記の情報から生年月日をyyyy/MM/ddの形式に変換したいのですが、年の頭二桁を求めるときに困っております。 ### 発生している問題・エラーメッセージ 下記のコードでは仕様漏れがあり、不正な生年月日に変換される。 ### 該当のソースコード ``` 'パターン1 '下記では西暦の頭部分の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)) 'パターン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のパターンが考えられる為。) 下二桁と年齢から正しく算出できないでしょうか。
回答: 実際に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)); } ```