- PR -

年齢計算

投稿者投稿内容
tabou
常連さん
会議室デビュー日: 2002/07/15
投稿数: 39
投稿日時: 2003-12-04 10:07
C#で年齢計算を行いたいのです。
http://seagullclub.net/vba/vba14.htm
の記事を参考に組んでみたのですが、
DateDiffに相当する関数がC#で見つかりませんでした。
C#でどのようにすれば計算できるでしょうか?
よろしくお願いします。
なか-chan@最愛のiMac
ぬし
会議室デビュー日: 2002/07/17
投稿数: 385
お住まい・勤務地: 和光市・世田谷区
投稿日時: 2003-12-04 10:17
tabouさんこんにちは。

「TimeSpan 構造体」あたりを使うのでしょうか?
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-12-04 10:54
一応、これで求めることはできます。
#一般的かどうかは分かりませんが。。。

コード:

DateTime birth = new DateTime(year, month, day);
int age = (new DateTime((DateTime.Today - birth).Ticks)).Year - 1;


tabou
常連さん
会議室デビュー日: 2002/07/15
投稿数: 39
投稿日時: 2003-12-04 12:35
架空兎さん、なか-chanさんコメントありがとうございます。

架空兎さんの方法で年齢が求めることが出来ました。

ありがとうございました。
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-12-04 14:58
こんな感じでは。
コード:
public static int Age(DateTime d1,DateTime d2)
{
	DateTime d3 = new DateTime(d1.Year,1,1);
	d3 = d3.AddDays(d2.DayOfYear-1);
	return d2.Year - d1.Year + (d1 <= d3 ? 0 : -1);
}
public static void Main(string[] args)
{
	DateTime[] d = {new DateTime(1994,2,28), new DateTime(1996,2,29)};
	for (int i=0;i<2;++i)
	{
		for (int j=0;j<2;++j)
		{
			for (int k=0;k<3;++k)
			{
				DateTime d2 = d[i];
				d2 = d2.AddYears(j+1);
				d2 = d2.AddDays(k-1);
				Console.WriteLine("{0} 生まれの人は、{1} に {2}才です",
					d[i].ToShortDateString(),d2.ToShortDateString(),Age(d[i],d2));
			}
		}
	}
}
1994/02/28 生まれの人は、1995/02/27 に 0才です
1994/02/28 生まれの人は、1995/02/28 に 1才です
1994/02/28 生まれの人は、1995/03/01 に 1才です
1994/02/28 生まれの人は、1996/02/27 に 1才です
1994/02/28 生まれの人は、1996/02/28 に 2才です
1994/02/28 生まれの人は、1996/02/29 に 2才です
1996/02/29 生まれの人は、1997/02/27 に 0才です
1996/02/29 生まれの人は、1997/02/28 に 0才です
1996/02/29 生まれの人は、1997/03/01 に 1才です
1996/02/29 生まれの人は、1998/02/27 に 1才です
1996/02/29 生まれの人は、1998/02/28 に 1才です
1996/02/29 生まれの人は、1998/03/01 に 2才です

架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-12-04 18:05
tabou さん、すみません。
私のコードだと、

コード:

DateTime birth = new DateTime(1996, 2, 29);
DateTime today = new DateTime(1997, 2, 28);
int age = (new DateTime((today - birth).Ticks)).Year - 1;


とすると 1 才になってしまいます。。。
#誕生日になってないのに・・・。

正しい求め方は cats さんの通りです。

どうもすみませんでした。
tabou
常連さん
会議室デビュー日: 2002/07/15
投稿数: 39
投稿日時: 2003-12-05 06:47
catsさん、架空兎さん ありがとうございます。

catsさんの方法で条件を変えて実行してみたのですが

1994/12/31 生まれの人は、1995/12/30 に 0才です
1994/12/31 生まれの人は、1995/12/31 に 1才です

1994/12/31 生まれの人は、1996/12/30 に 2才です
1994/12/31 生まれの人は、1996/12/31 に 2才です

こうなるのですがなぜでしょう?
原因がおわかりでしたらよろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-05 08:59
 1996年が閏年なので、12月31日の「1月1日からの日数」が「366日目」になるためですね。1995年の12月31日は「365日目」なので、1996年12月30日と比較してしまうことになります。


 2月29日の人の誕生日を、「2月28日」とするか、「3月1日」とするかは、難しいところですね。

[追記]
なかなか良い境界値テストですね。何かで使うかもしれないので覚えておこうっと。
金融関係で使うかも。「2月29日」に借りた人の金利をどう計算するか。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-12-05 09:03 ]

スキルアップ/キャリアアップ(JOB@IT)