Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert milliseconds to years

I have a validator that checks if an user is at least 18 years old.

This is the check:

var res = /^([1-2]\d{3})\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])\-([0-9]{4})$/.exec(str);
var todays_date = new Date();
var birth_date = null;

if (res != null) {
    birth_date = new Date(res[1], res[2], res[3]);
    if (todays_date - birth_date > 565633905872) {

565633905872 is 18 years in milliseconds but how do I convert it to years before so I can just do:

if (todays_date - birth_date => 18) {
like image 433
rac Avatar asked Mar 10 '14 10:03

rac


People also ask

How do you convert milliseconds to age?

How to Convert Years to Milliseconds. To convert a year measurement to a millisecond measurement, multiply the time by the conversion ratio. The time in milliseconds is equal to the years multiplied by 31,556,952,000.

How much is a 1 millisecond?

A millisecond (from milli- and second; symbol: ms) is a unit of time in the International System of Units (SI) equal to one thousandth (0.001 or 10−3 or 1/1000) of a second and to 1000 microseconds.

How do you convert ms to time?

Algorithm: Take Input in milliseconds. Convert Milliseconds to minutes using the formula: minutes = (milliseconds/1000)/60). Convert Milliseconds to seconds using the formula: seconds = (milliseconds/1000)%60).


2 Answers

The number you have quoted is not the number of milliseconds in 18 years. It's too small even if you pretend there are no leap years.

The simplest way to test if somebody is at least 18 years old is to initialise a date object to their birthday, then use .getFullYear() and .setFullYear() to directly set the year 18 years forward. Then compare that with the current date.

Note also that in JS dates the month is zero-based, so you probably want to use res[2] - 1 when creating the date object.

birth_date = new Date(res[1], res[2] - 1, res[3]);
birth_date.setFullYear(birth_date.getFullYear() + 18);
if (birth_date <= new Date()) {

Or given you are constructing the birth_date from individual year, month and day you could just do:

birthPlus18 = new Date(+res[1] + 18, res[2] - 1, res[3]);
if (birthPlus18 <= new Date()) {

(The leading + in +res[1] + 18 is not a typo, it converts the string extracted by your regex into a number so that you can add 18 to it. You don't need to do the same thing for res[2] - 1 because - automatically converts both operands.)

Note also that your regex will happily allow dates that specify a day that is too high for the month, e.g., Feb 30 or Jun 31.

like image 146
nnnnnn Avatar answered Sep 22 '22 11:09

nnnnnn


There are better ways of checking this (see the answer of "nnnnnn"). But your question wasn't about a better way but, how you could convert to years.

You could write a function that does that, example:

function convertmili( mSeconds )
{
    return mSeconds / 31536000000;
}

The output of this function is still far from ideal, because your example would output: 17.9361334941654

So we could clean it up a bit:

function convertmili( mSeconds )
{
    var checkYear = Math.floor(mSeconds / 31536000000);
    return checkYear;
}

With this function, your example would output 17 and then you can check it the way you wanted.

like image 34
Barry Meijer Avatar answered Sep 23 '22 11:09

Barry Meijer