Moment: рдмрд╛рдЙрдВрдбреНрд░реА рдмрд░реНрдердбреЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдиреНрдпреВрдирддрдо рдЖрдпреБ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдлрд╝рд░ре░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: moment/moment

рдореБрджреНрджреЗ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо

рдореИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕рдЯреАрдХ рд╣реИ рдпрд╛ 18 рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐ рдХреА рдЙрдореНрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП diff() рдФрд░ duration() рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ 18 рд╕реЗ рдареАрдХ рдПрдХ рджрд┐рди рдЫреЛрдЯрд╛ рд╣реВрдВ рдФрд░ рдареАрдХ 18ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рджреЛ рдЬрдиреНрдорджрд┐рди рдЪреБрдиреЗ (рдЖрдЬ 27.02.2017 рд╣реИ):

  • рдареАрдХ 18: 27.02.1999
  • 18 рдХреЗ рддрд╣рдд рдПрдХ рджрд┐рди: 28.02.1999

рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛

// today date is: 27.02.2017

// exactly age 18    
var birthday = moment("27.02.1999", "DD.MM.YYYY"),
    age = moment.duration(moment().diff(birthday)).asYears();

      console.log(age); // output: 18.00325100985672; expected: == 18

// one day under age 18
var birthday = moment("28.02.1999", "DD.MM.YYYY"),
    age = moment.duration(moment().diff(birthday)).asYears();

    console.log(age); // output: 18.00053005036735; expected: < 18

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реАрдк-рдИрдпрд░ рдХреА рд╡рдЬрд╣ рд╕реЗ рдЧрдгрдирд╛ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдЬрдиреНрдорджрд┐рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрдпреБ 18 рд╡рд░реНрд╖ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд▓ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдХреНрд╖рдгрдЬ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЙрддреНрдкрд╛рджрди рдХреЛрдб

<form id="newsletter-form" data-parsley-validate="">
  <input id="birthday" type="text" class="form-control" required="" data-parsley-minage="18">
  <input type="submit" class="btn btn-default" value="subscribe">
</form>

<script type="text/javascript">
    $(function () {
        window.Parsley.addValidator('minage', {
            validateString: function(value, minAge) {
                var birthday = moment(value, "DD.MM.YYYY"),
                    age = moment.duration(moment().diff(birthday)).asYears();

                return (age >= minAge);
            },
            requirementType: 'integer',
            messages: {
                en: 'You must be mature.'
            }
        });
    });
</script>
<script type="text/javascript">
    $(function () {
        $('#newsletter-form').parsley()
            // field validation
            .on('form:submit', function() {
                return false; // do not submit
            });
    });
</script>

рд╡рд╛рддрд╛рд╡рд░рдг

рд╡рд┐рдВрдбреЛрдЬ 7 рдкрд░ рдХреНрд░реЛрдо рд╕рдВрд╕реНрдХрд░рдг 56.0.2924.87 (64-рдмрд┐рдЯ)

рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ

  • рдорд╢реАрди рдХрд╛ рд╕рдордп рдХреНрд╖реЗрддреНрд░: "(UTC+01:00) рдПрдореНрд╕реНрдЯрд░реНрдбрдо, рдмрд░реНрд▓рд┐рди, рдмрд░реНрди, рд░реЛрдо, рд╕реНрдЯреЙрдХрд╣реЛрдо, рд╡рд┐рдпрди"
  • рд╕рдордп рдФрд░ рддрд╛рд░реАрдЦ рдЬрд┐рд╕ рдкрд░ рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: "рд╕реЛрдо рдлрд░рд╡рд░реА 27 2017 13:38:04 рдЬреАрдПрдордЯреА+0100"
  • рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп: jquery-3.1.1, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-3.3.7, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк-рдбреЗрдЯрдкрд┐рдХрд░-1.6.4, parselyjs-2.6.2
console.log( (new Date()).toString()) // Mon Feb 27 2017 13:38:04 GMT+0100 (Mitteleurop├дische Zeit)
console.log((new Date()).toLocaleString()) // 27.2.2017, 13:38:04
console.log( (new Date()).getTimezoneOffset()) // -60
console.log( navigator.userAgent) // Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
console.log(moment.version) // 2.17.1

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрджрд┐ рдЖрдк рдЕрднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

age = moment().diff(birthday, 'years');

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрдгрдирд╛ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдкрд░ рдХрд░реАрдм рд╣реИред рд╢рд╛рдпрдж рдЧреЛрд▓рд╛рдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

a = moment("27.02.1999", "DD.MM.YYYY");
b = moment("28.02.1999", "DD.MM.YYYY");
c = moment("27.02.2017", "DD.MM.YYYY");
moment.duration(c.diff(a)).asYears(); // 18.00173857094944
moment.duration(c.diff(b)).asYears(); // 17.99900066394245

рддреЛ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, moment.duration(end.diff(start)).asYears() рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рд▓рдЧрднрдЧ 16 рдШрдВрдЯреЗ рдкрд╣рд▓реЗ 18 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЖрдпреБ 18 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЖрдк рд╡рд░реНрд╖реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ (рдпрджрд┐ 18 рд╡рд░реНрд╖ рдЕрд▓рдЧ рд╣реИрдВ) рдорд╣реАрдиреЗ, рдлрд┐рд░ рджрд┐рдиред

// pseudocode, correctness not guaranteed
function is18(start, end) {
  if (end.year() - start.year() == 18) {
    if (end.month() == start.month()) {
      return end.date() >= start.date();
    }
    return end.month() > start.month();
  }
  return end.year() - 18 > start.year();
}

рдпрджрд┐ рдЖрдк рдЕрднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

age = moment().diff(birthday, 'years');

@ рдПрдордЬреЗ1856

рд╣рд╛рдБ, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

// today date is: 03.03.2017

// exactly age 18    
var birthday = moment("03.03.1999", "DD.MM.YYYY"),
    age = moment().diff(birthday, 'years');

      console.log(age); // output: 18; expected: == 18

// one day under age 18
var birthday = moment("04.03.1999", "DD.MM.YYYY"),
    age = moment().diff(birthday, 'years');

    console.log(age); // output: 17; expected: < 18
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

alvarotrigo picture alvarotrigo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nikocraft picture nikocraft  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dogukankotan picture dogukankotan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

IbraheemAlSaady picture IbraheemAlSaady  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

benhathaway picture benhathaway  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ