javascriptdate

How do I convert a decimal year value into a Date in Javascript?


OK, this is basically a Javascript version of How can I convert a decimal year value into a Date in Ruby? and not exactly a duplicate of Javascript function to convert decimal years value into years, months and days

Input:

2015.0596924

Desired output:

January 22, 2015

I have solved it (see below), but I expect (just like the Ruby version of this question) that there is a better way.


Solution

  • The other solution would be:

    1. Create date for given year (integer part)
    2. Calculate days from reminder (decimal part) and convert to milliseconds
    3. Add milliseconds to (1)

    In script:

    function leapYear(year) {
        return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    };
    
    function convertDecimalDate(decimalDate) {
        var year = parseInt(decimalDate);
        var reminder = decimalDate - year;
        var daysPerYear = leapYear(year) ? 366 : 365;
        var miliseconds = reminder * daysPerYear * 24 * 60 * 60 * 1000;
        var yearDate = new Date(year, 0, 1);
        return new Date(yearDate.getTime() + miliseconds);
    }
    
    var date = convertDecimalDate(2015.0596924);
    console.log(date);

    You can play with it on this Fiddle.