Une formule pour calculer simplement l'âge à partir de la date de naissance et sa preuve
Lorsque vous souhaitez trouver facilement l'âge de votre anniversaire À partir de la date d'aujourd'hui au format «aaaammjj», l'anniversaire également au format «aaaammjj» peut être soustrait tel quel, et la partie entière de la solution divisée par 10 000 peut être utilisée comme âge actuel.
Par exemple, si aujourd'hui est le 18 août 2017 et que votre anniversaire est le 20 août 1990,
\begin{align}
\mbox{âge}
&=floor\left(\frac{20170818-19900820}{10000}\right)\\
&=floor\left(\frac{269998}{10000}\right)\\
&=floor\left(26.9998\right)\\
&=26
\end{align}
Cela peut être généralisé à la formule suivante.
\begin{align}
\mbox{âge}
&=floor\left(\frac{\left(\mbox{Année actuelle}\times10000+\mbox{Mois en cours}\times100+\mbox{Date actuelle}\right)-\left(\mbox{Année de naissance}\times10000+\mbox{Mois de naissance}\times100+\mbox{anniversaire}\right)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }{10000}\right)
\end{align}
Si nous sommes aujourd'hui le 18/08/2017 et que votre anniversaire est le 20/08/1990
\begin{align}
\text{âge}
&= floor\left(\frac{\left(2017\times1000+08\times100+18\right)-\left(1990\times1000+08\times100+20\right)}{10000}\right)\\
&= floor\left(\frac{20170818-19900820}{10000}\right)\\
&= floor\left(\frac{269998}{10000}\right)\\
&= floor\left(26.9998\right)\\
&= 26
\end{align}
Si aujourd'hui est le 20/08/2017 et que votre anniversaire est le 20/08/1990
\begin{align}
\text{âge}
&= floor\left(\frac{\left(2017\times1000+08\times100+20\right)-\left(1990\times1000+08\times100+20\right)}{10000}\right)\\
&=floor\left(\frac{20170820-19900820}{10000}\right)\\
&=floor\left(\frac{270000}{10000}\right)\\
&=floor\left(27\right)\\
&=27
\end{align}
Je veux juste faire quelque chose comme "corriger la milliseconde écoulée depuis l'heure UNIX ..." avec un réflexe spinal, mais quand je pense calmement, je pense que cette logique est une idée très naturelle.
(Pour ceux qui ne sont pas convaincus [** Expliquez un peu plus clairement ici **](#% E6% 95% B0% E5% BC% 8F% E3% 81% AE% E3% 82% 84% E3% 82% 84% E8% A9% B3% E3% 81% 97% E3% 81% 84% E8% A7% A3% E8% AA% AC))
Cependant, la définition de la formule de calcul de l'âge pouvant changer en fonction de la cible d'utilisation (notamment dans les relations juridiques), cette formule de calcul ne peut pas toujours être utilisée telle quelle.
calcAge.js
/**
*Une fonction qui renvoie l'âge à partir de l'anniversaire
* @param {!string} birthdayStr -Entrez votre anniversaire au format aaaammjj
* @return {number}Âge calculé
**/
var calcAge = function(birthdayStr){
if(isNaN(birthdayStr)||birthdayStr.length !== 8){
return -1;
}
var d = new Date();
var dStr = ''+d.getFullYear()+('0'+(d.getMonth()+1)).slice(-2)+('0'+d.getDate()).slice(-2);
return Math.floor((parseInt(dStr)-parseInt(birthdayStr))/10000);
};
console.log(calcAge('19900820'));
calcAge.py
# -*- coding: utf-8 -*-
from datetime import datetime
import math
def calcAge(birthdayStr):
if not (birthdayStr.isdigit() and len(birthdayStr)==8):
return -1
dStr = datetime.now().strftime("%Y%m%d")
return math.floor((int(dStr)-int(birthdayStr))/10000)
print(calcAge("19900817"))
L'expression de «return» est
python
return (int(dStr)-int(birthdayStr))//10000
Mais d'accord.
calcAge.rb
require "date"
def calcAge(birthdayStr)
if birthdayStr !~ /^[0-9]{8}$/
return -1
end
return (Date.today.strftime("%Y%m%d").to_i - birthdayStr.to_i) / 10000
end
print calcAge("19900820")
Dans Ruby, le traitement au sol n'est pas nécessaire car les fractions après la virgule décimale sont arbitrairement tronquées lors de la division entre les types entiers.
→ Fonction de date SQL (calcul de l'âge) | Blog sur la technologie informatique dbSheetClient
Il existe une fonction DATEDIF () Cette formule n'est donc pas nécessaire, mais c'est un moyen efficace lorsque les données d'origine ne sont pas de type date lors de l'importation et du traitement du CSV.
=FLOOR.MATH((TEXT(TODAY(),"yyyymmdd")-[Date de naissance au format aaaammjj])/10000)
[Fonction FLOOR.MATH ()](https://support.office.com/ja-jp/article/FLOOR-MATH-%E9%96%A2%E6%95%B0-c302b599-fbdb-4177-ba19- 2c2b1249a2f5) ne peut pas être utilisé dans les anciens Excel. Dans ce cas, utilisez la fonction INT OK si vous l'utilisez.
=INT((TEXT(TODAY(),"yyyymmdd")-[Date de naissance au format aaaammjj])/10000)
Cette formule calcule ** l'âge actuel **, mais ne calcule pas ** quel âge vous aurez aujourd'hui **. [Loi Niseki Suru pour le calcul de l'âge](https://ja.wikipedia.org/wiki/%E5%B9%B4%E9%BD%A2%E8%A8%88%E7%AE%97%E3%83% Selon 8B% E9% 96% A2% E3% 82% B9% E3% 83% AB% E6% B3% 95% E5% BE% 8B), ** le moment du vieillissement ** n'est pas le jour de l'anniversaire. ** Moment de la veille de l'anniversaire ** (= 24:00: 0 la veille). Autrement dit, une personne qui est ** née le 1er avril 2000 ** avait 5 ans au début du 31 mars 2006, mais aura 6 ans ** à la fin du 31 mars 2006 * * Le 1er avril 2006 sera célébré à l'âge de 6 ans **.
Selon cette définition, même les personnes nées le 29 février, Uru, vieillissent d'un an chaque année.
Selon la loi sur l'enseignement scolaire **, les personnes âgées de 6 ans à la veille du 1er avril ** doivent entrer à l'école primaire. «Les personnes nées le 1er avril 2000» ont ** 6 ans au 31 mars 2006, la veille du 1er avril 2006 **, donc ** 1er avril 2006 Devenu un premier niveleur ** de la journée Pour la même raison, «les personnes nées le 15 mars 2000» et les «personnes nées le 20 avril 1999» sont dans le même grade.
«Les personnes nées le 2 avril 2000» n'ont pas atteint l'âge de 6 ans la veille du 1er avril 2006, elles seront donc en première année du primaire à partir du 1er avril 2007, l'année suivante.
Pour ceux qui veulent creuser un peu plus. Même des informations sur l'année de naissance et l'année en cours peuvent vous dire quel âge vous aurez cette année.
Âge de cette année = année de naissance en cours
Cependant, je ne connais pas "l'âge actuel" car je ne sais pas si l'anniversaire de cette année est venu. Si ** n'a pas atteint l'anniversaire de cette année **, alors ** "l'âge actuel" doit être calculé ** en soustrayant 1 $ de "l'âge de cette année".
Cela peut être exprimé par la ** formule spécifique au cas ** comme suit.
\begin{eqnarray}
\mbox{âge}=\left\{
\begin{array}{ll}
\mbox{Année actuelle}-\mbox{Année de naissance}&\left(\mbox{Date de naissance}\leq\mbox{Date actuelle}\right)\cdots\mbox{(1)Cérémonie après l'anniversaire de cette année}\\
\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{-1}&\left(\mbox{Date de naissance}>\mbox{Date actuelle}\right)\cdots\mbox{(2)Cérémonie jusqu'à la veille de l'anniversaire de cette année}\\
\end{array}
\right.
\end{eqnarray}
En transformant la formule simple pour l'âge, une formule similaire à la ** formule spécifique au cas ** ci-dessus peut être créée. La $ \ color {red} {partie de caractère rouge} $ de cette formule transformée contient le processus de "$ -1 $ si l'anniversaire de cette année n'est pas venu".
\begin{align}
\mbox{âge}
&=floor\left(\frac{\left(\mbox{Année actuelle}\times10000+\mbox{Mois en cours}\times100+\mbox{Date actuelle}\right)-\left(\mbox{Année de naissance}\times10000+\mbox{Mois de naissance}\times100+\mbox{anniversaire}\right)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }{10000}\right)\\
&=floor\left(\frac{\left(\mbox{Année actuelle}-\mbox{Année de naissance}\right)\times10000+\left(\mbox{Mois en cours}-\mbox{Mois de naissance}\right)\times100+\mbox{Date actuelle}-\mbox{anniversaire}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }{10000} \right)\\
&=\color{red}{floor}\left(\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{+\frac{\mbox{Mois en cours}-\mbox{Mois de naissance}}{100}+\frac{\mbox{Date actuelle}-\mbox{anniversaire}}{10000}}\right)\\
\end{align}
Le remplacement de la ** partie totale des résultats des calculs mensuels et journaliers ** de cette formule par $ X $ aboutit à une formule simple très similaire à la ** formule spécifique au cas ** qui apparaissait précédemment.
\begin{align}
\mbox{âge}&=\color{red}{floor}\left(\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{+X}\right)\\\\
\color{red}{X}&=\frac{\mbox{Mois en cours}-\mbox{Mois de naissance}}{100}+\frac{\mbox{Date actuelle}-\mbox{anniversaire}}{10000}\\\\\\
\end{align}
La plage que la valeur de $ X $ peut prendre est la suivante
--Quand aujourd'hui est le jour de votre anniversaire
→ Mois en cours = mois de naissance, date actuelle = anniversaire, donc 0 $
--Quand aujourd'hui est le 31 décembre et votre anniversaire est le 1er janvier
→ Valeur maximale $ X_ {max} $
\begin{align}
X_{max}&=\frac{\mbox{12}-\mbox{1}}{100}+\frac{\mbox{31}-\mbox{1}}{10000}=0.1130\\\\
\end{align}
--Quand aujourd'hui est le 1er janvier et votre anniversaire est le 31 décembre
→ Valeur minimale $ X_ {min} $
\begin{align}
X_{min}&=\frac{\mbox{1}-\mbox{12}}{100}+\frac{\mbox{1}-\mbox{31}}{10000}=-0.1130
\end{align}
Donc
-0.1130\leq X \leq 0.1130
Relation entre cadeau et anniversaire dans l'année | |
---|---|
Le résultat de "$ \ mbox {année courante} - \ mbox {année de naissance} $" est toujours un entier supérieur ou égal à $ 0 $, soit $ 0 \ leq X_ {après} \ leq 0,1130 $. $ X $ n'affecte pas le résultat du calcul et est ignoré.
\begin{align}
\mbox{âge}
&=floor\left(\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{+X_{after}}\right)\\
&=\mbox{Année actuelle}-\mbox{Année de naissance}
\end{align}
Ceci est conforme à la ** formule spécifique au cas "(1) Formule après l'anniversaire de cette année" **.
Le résultat de "$ \ mbox {année courante} - \ mbox {année de naissance} $" est toujours un entier supérieur ou égal à $ 0 $, soit -0,1130 $ \ leq X_ {avant} <0 $. $ X $ a pour effet de soustraire 1 du résultat du calcul pour l'année.
\begin{align}
\mbox{âge}
&=floor\left(\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{+X_{before}}\right)\\
&=\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{-1}
\end{align}
Ceci est conforme à la ** formule spécifique au cas "formule (2) jusqu'à la veille de l'anniversaire de cette année" **.
Par conséquent, la formule
\begin{align}
\mbox{âge}
&=floor\left(\frac{\left(\mbox{Année actuelle}\times10000+\mbox{Mois en cours}\times100+\mbox{Date actuelle}\right)-\left(\mbox{Année de naissance}\times10000+\mbox{Mois de naissance}\times100+\mbox{anniversaire}\right)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }{10000}\right)
\end{align}
La solution de est la même que la formule suivante, et l'âge actuel peut être calculé à partir de l'anniversaire.
\begin{eqnarray}
\mbox{âge}=\left\{
\begin{array}{ll}
\mbox{Année actuelle}-\mbox{Année de naissance}&\left(\mbox{Date de naissance}\leq\mbox{Date actuelle}\right)\cdots\mbox{(1)Cérémonie après l'anniversaire de cette année}\\
\mbox{Année actuelle}-\mbox{Année de naissance}\color{red}{-1}&\left(\mbox{Date de naissance}>\mbox{Date actuelle}\right)\cdots\mbox{(2)Cérémonie jusqu'à la veille de l'anniversaire de cette année}\\
\end{array}
\right.
\end{eqnarray}
L'une des choses intéressantes à propos de la programmation est de savoir comment rendre le traitement effectué dans le cerveau ** concret et le mettre en logique simple **. Ce code est tout simplement très amusant, donc c'était amusant de le regarder.
Si vous êtes intéressé par le traitement des dates Excel, veuillez également vérifier ici. → [Excel] Identité des informations de date et d'heure --Qiita
Pour ceux qui veulent faire une inspection plus solide du format yyyymmdd
→ Format Yyyyymmdd Vérification de la validité des chaînes de date Décodage des expressions régulières --Qiita
Recommended Posts