Używam luxon.js i chcę sprawdzić, czy wiek użytkownika przekracza 21 lat. Kod, którego do tego używam

const isTooYoung = date =>
  DateTime.fromFormat(date, 'dd.MM.yyyy')
    .diffNow()
    .as('years') < -21;

Ale na dzisiejszy dzień (18.11.2019) oba telefony:

console.log(isTooYoung('15.11.1998')); // true => incorrect
console.log(isTooYoung('20.11.1998')); // true => correct, this user is not 21 year old yet

Skrzypce: http://jsfiddle.net/zh4ub62j/1/

Jaki jest więc prawidłowy sposób rozwiązania problemu, aby sprawdzić, czy wiek użytkownika przekracza x lat?

4
J. Doe 18 listopad 2019, 13:59

1 odpowiedź

Najlepsza odpowiedź

Konwersja między jednostkami czasu trwania jest stratna, ponieważ lata nie są takie same, a Luxon „zatracił” wiedzę, że czas trwania pochodzi z tego konkretnego przedziału czasu. W dokumentacji znajduje się sekcja na ten temat: https://moment. github.io/luxon/docs/manual/math.html#losing-information

Na szczęście obejście tego problemu jest proste: po prostu zrób różnicę w latach. Wtedy Luxon będzie wiedział, jak wykonać obliczenia w rzeczywistych latach kalendarzowych:

// now is 27.11.2019

const isTooYoung = date =>
  luxon.DateTime.fromFormat(date, 'dd.MM.yyyy')
    .diffNow('years')
    .years < -21;

console.log(isTooYoung('15.11.1998'))
console.log(isTooYoung('30.11.1998'))

Skrzypce: http://jsfiddle.net/j8n7g4d6/

10
snickersnack 27 listopad 2019, 18:16