Moment: ๊ฒฝ๊ณ„ ์ƒ์ผ ๊ฐ’์„ ์‚ฌ์šฉํ•œ ์ตœ์†Œ ์—ฐ๋ น ๊ณ„์‚ฐ์œผ๋กœ ์ธํ•ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•จ

์— ๋งŒ๋“  2017๋…„ 02์›” 27์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: moment/moment

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช… ๋ฐ ์žฌํ˜„ ๋‹จ๊ณ„

์‚ฌ๋žŒ์ด ์ •ํ™•ํ•œ์ง€ ๋˜๋Š” 18์„ธ ์ด์ƒ์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ diff() ์™€ duration() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๋žŒ์˜ ๋‚˜์ด๋ฅผ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋…ผ๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๊ณ„ ๊ฐ’์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ 18์„ธ๋ณด๋‹ค ์ •ํ™•ํžˆ ํ•˜๋ฃจ ์–ด๋ฆฌ๊ณ  ์ •ํ™•ํžˆ 18์„ธ์ธ์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์ƒ์ผ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ค๋Š˜์€ 27.02.2017).

  • ์ •ํ™•ํžˆ 18: 27.02.1999
  • 18์„ธ ๋ฏธ๋งŒ์˜ ๋‚ : 1999๋…„ 2์›” 28์ผ

๋‚ณ๋‹ค

// 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 ์„ธ๊ฐ€๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ momentjs๋กœ ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ  ๋‚ด๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด momentjs์˜ ๋ฌธ์„œ์— ์–ธ๊ธ‰๋˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ์‚ฐ ์ฝ”๋“œ

<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>

ํ™˜๊ฒฝ

Windows 7์˜ Chrome ๋ฒ„์ „ 56.0.2924.87(64๋น„ํŠธ)

๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ์ •๋ณด

  • ๊ธฐ๊ณ„์˜ ์‹œ๊ฐ„๋Œ€: "(UTC+01:00) ์•”์Šคํ…Œ๋ฅด๋‹ด, ๋ฒ ๋ฅผ๋ฆฐ, ๋ฒ ๋ฅธ, ๋กฌ, ์Šคํ†กํ™€๋ฆ„, ๋นˆ"
  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ์‹œ๊ฐ„ ๋ฐ ๋‚ ์งœ: "Mon Feb 27 2017 13:38:04 GMT+0100"
  • ์‚ฌ์šฉ ์ค‘์ธ ๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: jquery-3.1.1, bootstrap-3.3.7, bootstrap-datepicker-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');

@mj1856

์˜ˆ, ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

// 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 ๋“ฑ๊ธ‰