how can I convert day of year to date in javascript?

后端 未结 9 1014
一整个雨季
一整个雨季 2020-11-30 08:48

I want to take a day of the year and convert to an actual date using the Date object. Example: day 257 of 1929, how can I go about doing this?

相关标签:
9条回答
  • 2020-11-30 09:11

    Here's my implementation, which supports fractional days. The concept is simple: get the unix timestamp of midnight on the first day of the year, then multiply the desired day by the number of milliseconds in a day.

    /**
     * Converts day of the year to a unix timestamp
     * @param {Number} dayOfYear 1-365, with support for floats
     * @param {Number} year (optional) 2 or 4 digit year representation. Defaults to
     * current year.
     * @return {Number} Unix timestamp (ms precision)
     */
    function dayOfYearToTimestamp(dayOfYear, year) {
      year = year || (new Date()).getFullYear();
      var dayMS = 1000 * 60 * 60 * 24;
    
      // Note the Z, forcing this to UTC time.  Without this it would be a local time, which would have to be further adjusted to account for timezone.
      var yearStart = new Date('1/1/' + year + ' 0:0:0 Z');
    
      return yearStart + ((dayOfYear - 1) * dayMS);
    }
    
    // usage
    
    // 2015-01-01T00:00:00.000Z
    console.log(new Date(dayOfYearToTimestamp(1, 2015)));
    
    // support for fractional day (for satellite TLE propagation, etc)
    // 2015-06-29T12:19:03.437Z
    console.log(new Date(dayOfYearToTimestamp(180.51323423, 2015)).toISOString);
    
    0 讨论(0)
  • 2020-11-30 09:12

    You have a few options;

    If you're using a standard format, you can do something like:

    new Date(dateStr);
    

    If you'd rather be safe about it, you could do:

    var date, timestamp;
    try {
        timestamp = Date.parse(dateStr);
    } catch(e) {}
    if(timestamp)
        date = new Date(timestamp);
    
    or simply,    
    
    new Date(Date.parse(dateStr));
    

    Or, if you have an arbitrary format, split the string/parse it into units, and do:

    new Date(year, month - 1, day)
    

    Example of the last:

    var dateStr = '28/10/2010'; // uncommon US short date
    var dateArr = dateStr.split('/');
    var dateObj = new Date(dateArr[2], parseInt(dateArr[1]) - 1, dateArr[0]);
    
    0 讨论(0)
  • 2020-11-30 09:14

    The shortest possible way is to create a new date object with the given year, January as month and your day of the year as date:

    const date = new Date(2017, 0, 365);
    
    console.log(date.toLocaleDateString());

    As for setDate the correct month gets calculated if the given date is larger than the month's length.

    0 讨论(0)
  • 2020-11-30 09:16

    this also works ..

    function to2(x) { return ("0"+x).slice(-2); }
    function formatDate(d){
        return d.getFullYear()+"-"+to2(d.getMonth()+1)+"-"+to2(d.getDate());
        }
    document.write(formatDate(new Date(2016,0,257)));
    

    prints "2016-09-13"

    which is correct as 2016 is a leaap year. (see calendars here: http://disc.sci.gsfc.nasa.gov/julian_calendar.html )

    0 讨论(0)
  • 2020-11-30 09:20

    "I want to take a day of the year and convert to an actual date using the Date object."

    After re-reading your question, it sounds like you have a year number, and an arbitrary day number (e.g. a number within 0..365 (or 366 for a leap year)), and you want to get a date from that.

    For example:

    dateFromDay(2010, 301); // "Thu Oct 28 2010", today ;)
    dateFromDay(2010, 365); // "Fri Dec 31 2010"
    

    If it's that, can be done easily:

    function dateFromDay(year, day){
      var date = new Date(year, 0); // initialize a date in `year-01-01`
      return new Date(date.setDate(day)); // add the number of days
    }
    

    You could add also some validation, to ensure that the day number is withing the range of days in the year supplied.

    0 讨论(0)
  • 2020-11-30 09:27

    // You might need both parts of it-

    Date.fromDayofYear= function(n, y){
        if(!y) y= new Date().getFullYear();
        var d= new Date(y, 0, 1);
        return new Date(d.setMonth(0, n));
    }
    Date.prototype.dayofYear= function(){
        var d= new Date(this.getFullYear(), 0, 0);
        return Math.floor((this-d)/8.64e+7);
    }
    
    var d=new Date().dayofYear();
    //
    alert('day#'+d+' is '+Date.fromDayofYear(d).toLocaleDateString())
    
    
    /*  returned value: (String)
    day#301 is Thursday, October 28, 2010
    */
    
    0 讨论(0)
提交回复
热议问题