簡単な年齢の計算(1年は365.24日)

気づいてしまえば当たり前なことだが、閏年の計算法を間違っていた。
一年を365日で計算すると閏年を考えなければならない。

しかし、一年は正確には365.24日(もっと正確には365.242190日)だから、
この数値を使えばややここしい閏年の計算はいらない。

Swiftでは時間は秒数で計算される。秒を年に直すと端数の0.24日が計算結果に大きく影響する。つまりこれが閏年の生まれる原因なのだ。

一年を365.24日で計算すれば、閏年を考慮しなくても正確な年齢がごく簡単に計算できる。

一年は365日ではなくて365.24日なのである(教訓。


(目が点!でも、これで年齢の計算はひと段落)
=============================
(備忘録)簡単な年齢の計算方法
プレイグランド:一年は365.24日で計算する
日付は日本暦で表示する
以下、\は\(英数)に換える(はてなでは文字化けする)
=============================
// Playground - noun: a place where people can play
// 年齢を計算する
// 誕生日をNSDate型に変換して定義
// 時間(秒数)を年数に変換
// 閏年の補正を考える
// yasui_swift
// Xcode7.1 .1 Swift2
// 2015_11_14

import UIKit

var message = "おじいさんはいくつになったかな?"
print(message)

let formatter = NSDateFormatter()//dateFormatterの名前をformatterに設定
formatter.locale = NSLocale(localeIdentifier: "ja_JP")
formatter.dateStyle = NSDateFormatterStyle.ShortStyle
formatter.dateFormat = "yyyy年MM月dd日"

let myBirthday = formatter.dateFromString("1950年11月16日")!
print("誕生日は\(formatter.stringFromDate(myBirthday))です")//日本暦。

var myNextBirthday = formatter.dateFromString("2015年11月16日")!//!のつけ忘れに注意。日本暦。
print("次の誕生日は\(formatter.stringFromDate(myNextBirthday))です")//\は\(英数)に換える(はてなでは文字化けする)

let now = NSDate()//今の時間

var myAge = now.timeIntervalSinceDate(myBirthday)//生まれてからの秒数
print("1年を365日で計算すると、\(myAge/60/60/24/365)年となって誤差がでる")//1年を365日で計算。閏年を含んでいるので暦年齢とは違う値になる//\は\(英数)に換える(はてなでは文字化けする)

//閏年の補正。1年を365.24日にして計算
//let yearsCalc = 60*60*24*365.24//秒数を年数に直す定数。
//var myAge3 = myAge/yearsCalc//変数で割るとエラーになる
//print(myAge3/yearsCalc)//yearsCalcはnilになる可能性がありエラーになる

let yearsCalc1:double_t = 1/60/60/24/365.24//逆数にして、nilで割らないようにする
var myAge3 = myAge*yearsCalc1//結果は少数型になる
print("おじいさんの年齢は\(myAge3)年です")//\は\(英数)に換える(はてなでは文字化けする)

//百年に一度の閏年でない歳の補正
//1年が365.242190日であるので閏年がある.4年に一度が閏年
//百年に一度は閏年ではなくなる(さらに四百年に一度は閏年になる)ための補正
//四百歳は生きないので無視。
var uruDoshi = Int(myAge3/4)//閏年の回数
//百歳以上の閏年の補正
if myAge3 >= 100 {

print("年齢は百歳以上です。正確には閏年の補正が必要です。")
uruDoshi = uruDoshi-1

}

print("今までの閏年の回数は\(uruDoshi)回です")

var myAge4 = Int(myAge)//秒齢
var myAge4D = Double(myAge4)
var myAge5 = Int(myAge4/60/60/24)//日齢
var myAge6 = Int(myAge4D * yearsCalc1)//年齢_端数の切り捨て:満年齢:整数Integer

//print(myAge3-myAge6)//これでは数字の型が異なりエラーになる
var myAgeD = Double(myAge6)//少数型に変換
print("年齢は\(myAge6)歳です")
print("日齢は\(myAge5)日です")
print("秒齢は\(myAge4)秒です")
//正確な年齢(生存期間)を年数と日数で表示したい
print("---------")

var timesBeforeNextBirthday = myNextBirthday.timeIntervalSinceDate(NSDate())
var daysBeforeNextBirthday = timesBeforeNextBirthday/60/60/24
var days1 = Int(daysBeforeNextBirthday*100)
var days2 = Double(days1)/100
if days2 < 0{
days2 = days2*(-1)
print("誕生日から\(days2)日が経ちました。")
print("次の誕生日までは\(Int(365.24-days2))日です。")
} else{
print("次の誕生日まであと、\(days2)日です。")
}
======================
結果
______________________
おじいさんはいくつになったかな?
誕生日は1950年11月16日です
次の誕生日は2015年11月16日です
1年を365日で計算すると、65.039256883845年となって誤差がでる
おじいさんの年齢は64.9965194464008年です
今までの閏年の回数は16回です
年齢は満64歳です
日齢は23739日です
秒齢は2051078005秒です

                • -

次の誕生日まではあと、1.67日です。
======================