Jak obliczyć wiek w latach, biorąc pod uwagę datę urodzenia w formacie RRRRMMDD? Czy jest możliwe użycie tej Date()
funkcji?
Szukam lepszego rozwiązania niż to, którego używam teraz:
var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
age--;
}
alert(age);
javascript
date
Franciszek
źródło
źródło
Date
musiałby zrobić obiekt, gdyby go zamknął. Ludzie mogli pisać książki o tym, jak JS zachowuje się podstępnieDate
. ... Jeśli możesz żyć z czasem nieobecności w ciągu dnia, przybliżenie:AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )
jest tak proste, jak to tylko możliwe.Odpowiedzi:
Chciałbym uzyskać czytelność:
Oświadczenie: Ma to również problemy z precyzją, więc nie można w pełni zaufać. Może być wyłączony o kilka godzin, na kilka lat lub w czasie letnim (w zależności od strefy czasowej).
Zamiast tego poleciłbym do tego bibliotekę, jeśli precyzja jest bardzo ważna. Jest również
@Naveens post
prawdopodobnie najdokładniejszy, ponieważ nie zależy od pory dnia.Punkty odniesienia: http://jsperf.com/birthday-calculation/15
źródło
Spróbuj tego.
Uważam, że jedyną rzeczą, która wyglądała prymitywnie w twoim kodzie, była
substr
część.Fiddle : http://jsfiddle.net/codeandcloud/n33RJ/
źródło
Ważne: ta odpowiedź nie zapewnia 100% dokładnej odpowiedzi, jest wyłączona o około 10-20 godzin w zależności od daty.
Oczywiście nie mogłem się oprzeć pokusie podjęcia wyzwania i stworzenia szybszego i krótszego kalkulatora urodzinowego niż obecnie akceptowane rozwiązanie. Głównym punktem mojego rozwiązania jest to, że matematyka jest szybka, więc zamiast korzystać z rozgałęzień, a javascript modelu daty zapewnia obliczenie rozwiązania, używamy wspaniałej matematyki
Odpowiedź wygląda tak i działa około 65% szybciej niż naveen, a ponadto jest znacznie krótsza:
Magiczna liczba: 31557600000 to 24 * 3600 * 365.25 * 1000, czyli długość roku, długość roku to 365 dni i 6 godzin, czyli 0,25 dnia. Na koniec przedstawiam wynik, który daje nam końcowy wiek.
Oto kryteria: http://jsperf.com/birthday-calculation
Aby wesprzeć format danych OP, możesz go wymienić
+new Date(dateString);
z
+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));
Jeśli możesz znaleźć lepsze rozwiązanie, udostępnij je! :-)
źródło
dateString
argument, aby konstruktor Date () mógł go poprawnie przeanalizować. Na przykład biorącYYYYMMDD
format podany w pytaniu, to się nie powiedzie.Z momentjs:
źródło
Oczyść jedno-liniowe rozwiązanie za pomocą ES6:
Używam roku 365,25 dni (0,25 z powodu lat przestępnych), które wynoszą odpowiednio 3,15576e + 10 milisekund (365,25 * 24 * 60 * 60 * 1000).
źródło
const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Jakiś czas temu stworzyłem funkcję w tym celu:
Przyjmuje obiekt Date jako dane wejściowe, dlatego należy przeanalizować
'YYYYMMDD'
sformatowany ciąg daty:źródło
birthDate
jest to 5 stycznia 1980 r. , A bieżącą datą jest 4 stycznia 2005 r. , Wówczas funkcja będzie błędnie zgłaszaćage
jako 25 ... Prawidłowa wartość to 24.Oto moje rozwiązanie, podaj datę, którą można przeanalizować:
źródło
Alternatywne rozwiązanie, ponieważ dlaczego nie:
źródło
źródło
Aby sprawdzić, czy urodziny już minęły, definiuję funkcję pomocnika
Date.prototype.getDoY
, która skutecznie zwraca numer dnia w roku. Reszta jest dość oczywista.źródło
Myślę, że tak może być po prostu:
Działa również ze znacznikiem czasu
źródło
Musiałem po prostu napisać tę funkcję dla siebie - zaakceptowana odpowiedź jest dość dobra, ale IMO może użyć trochę porządków. Wymaga to na czas uniksowego znacznika czasu, ponieważ było to moje wymaganie, ale można je szybko dostosować do użycia ciągu:
Zauważ, że użyłem płaskiej wartości 31 w mojej funkcji MeasureDays. W obliczeniach chodzi tylko o to, aby „dzień roku” był monotonicznie rosnącą miarą znacznika czasu.
Jeśli używasz znacznika czasu lub ciągu javascript, oczywiście będziesz chciał usunąć współczynnik 1000.
źródło
Aby uzyskać wiek, w którym rozpoczęła się data europejska:
źródło
Jeszcze jedno możliwe rozwiązanie z moment.js :
źródło
Sprawdziłem wcześniej pokazane przykłady i nie zadziałały we wszystkich przypadkach, dlatego stworzyłem własny skrypt. Przetestowałem to i działa idealnie.
źródło
To dla mnie najbardziej elegancki sposób:
źródło
Uzyskaj wiek (lata, miesiące i dni) od daty urodzenia za pomocą javascript
Funkcja calcularEdad (lata, miesiące i dni)
Funkcja esNumero
źródło
Działa idealnie dla mnie.
źródło
Wiem, że jest to bardzo stary wątek, ale chciałem wprowadzić tę implementację, którą napisałem, aby znaleźć wiek, który moim zdaniem jest znacznie dokładniejszy.
Oczywiście można to dostosować do innych formatów uzyskiwania parametrów. Mam nadzieję, że to pomoże komuś, kto szuka lepszego rozwiązania.
źródło
Użyłem tego podejścia, używając logiki zamiast matematyki. Jest precyzyjny i szybki. Parametry to rok, miesiąc i dzień urodzin osoby. Zwraca wiek osoby jako liczbę całkowitą.
źródło
Wychodząc z postów naveen i oryginalnych OP, otrzymałem kod wielokrotnego użytku, który akceptuje zarówno łańcuchy, jak i obiekty JS Date.
Nazwałem go,
gregorianAge()
ponieważ obliczenia te pokazują dokładnie, w jaki sposób określamy wiek za pomocą kalendarza gregoriańskiego. tzn. nie liczenie roku końcowego, jeśli miesiąc i dzień przypada przed miesiącem i dniem roku urodzenia.źródło
Dwie dodatkowe opcje:
źródło
Zrobiłem kilka aktualizacji do jednej poprzedniej odpowiedzi.
Mam nadzieję, że to pomoże: D
źródło
oto prosty sposób obliczania wieku:
źródło
źródło
Możesz użyć tego do ograniczenia wieku w swojej formie -
źródło
Jestem trochę za późno, ale uznałem, że jest to najprostszy sposób na obliczenie daty urodzenia.
Tag HTML:
Mam nadzieję, że to pomoże.
źródło
Oto najprostsze, najdokładniejsze rozwiązanie, jakie mogłem wymyślić:
A oto próbka, która weźmie pod uwagę 29 lutego -> 28 lutego rocznie.
Działa nawet z ujemnym wiekiem!
źródło
Jeszcze inne rozwiązanie:
źródło
Dzięki metodzie momentjs „fromNow” pozwala to na pracę ze sformatowaną datą, tj .: 03/15/1968
var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");
//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";
Jako wersja prototypowa
}
źródło