30

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?

0

9 Answers 9

55

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

Sign up to request clarification or add additional context in comments.

6 Comments

setDate() only accepts month numbers 0-30, so I think people have been upvoting this without testing it fully. Look at my answer at the bottom to see an alternative function. (I have a bart simpson avatar)
It is correct according to the doc: w3schools.com/jsref/jsref_setdate.asp "If the month has 31 days: 32 will result in the first day of the next month"
Or even shorter: return new Date(year, 0, day). ;-)
As @med116 says -- test carefully. I got some pretty weird results using this answer.
@MitchHaile, it should work, what med116 said is not right. Could you share the weird results? Usually, weird results in date manipulation functions occur due to timezone differences.
|
9

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.

Comments

5

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

2 Comments

sorry.. meant if I had a specific day of the year. example: lets say its day 232 of year 1995... how can I construct a new Date out of it?
var d=Date.fromDayofYear(232,1995)
5

Here is a function that takes a day number, and returns the date object

optionally, it takes a year in YYYY format for parameter 2. If you leave it off, it will default to current year.

var getDateFromDayNum = function(dayNum, year){

    var date = new Date();
    if(year){
        date.setFullYear(year);
    }
    date.setMonth(0);
    date.setDate(0);
    var timeOfFirst = date.getTime(); // this is the time in milliseconds of 1/1/YYYY
    var dayMilli = 1000 * 60 * 60 * 24;
    var dayNumMilli = dayNum * dayMilli;
    date.setTime(timeOfFirst + dayNumMilli);
    return date;
}

OUTPUT

// OUTPUT OF DAY 232 of year 1995

var pastDate = getDateFromDayNum(232,1995)
console.log("PAST DATE: " , pastDate);

PAST DATE: Sun Aug 20 1995 09:47:18 GMT-0400 (EDT)

1 Comment

Warning: this solution has timezone issues. It will give wrong answers some of the time.
2

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

Comments

1

If I understand your question correctly, you can do that from the Date constructor like this

new Date(year, month, day, hours, minutes, seconds, milliseconds)

All arguments as integers

Comments

1

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]);

1 Comment

sorry.. meant if I had a specific day of the year. example: lets say its day 232 of year 1995... how can I construct a new Date out of it?
0

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 )

Comments

0

If you always want a UTC date:

function getDateFromDayOfYear (year, day) {
  return new Date(Date.UTC(year, 0, day))
}

console.log(getDateFromDayOfYear(2020, 1)) // 2020-01-01T00:00:00.000Z
console.log(getDateFromDayOfYear(2020, 305)) // 2020-10-31T00:00:00.000Z
console.log(getDateFromDayOfYear(2020, 366)) // 2020-12-31T00:00:00.000Z

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.