Как я могу преобразовать день года в дату в JavaScript? - PullRequest
21 голосов
/ 29 октября 2010

Я хочу взять день года и преобразовать его в фактическую дату, используя объект Date. Пример: 257 день 1929 года, как я могу это сделать?

Ответы [ 8 ]

46 голосов
/ 29 октября 2010

"Я хочу взять день года и преобразовать его в фактическую дату с помощью объекта Date."

После повторного чтения вашего вопроса, звучит так, будто у вас есть номер года и произвольный номер дня (например, число в пределах 0..365 (или 366 для високосного года)), и вы хотите получить дату что.

Например:

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

Если это так, то это легко сделать:

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
}

Вы также можете добавить некоторую проверку, чтобы номер дня соответствовал диапазону дней в поставляемом году.

5 голосов
/ 03 октября 2014

Вот функция, которая принимает номер дня и возвращает объект даты

опционально, для параметра 2 требуется год в формате ГГГГ. Если вы его отключите, по умолчанию будет использоваться текущий год.

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

ПРОШЕДШАЯ ДАТА: вс 20 августа 1995 г. 09:47:18 GMT-0400 (EDT)

5 голосов
/ 29 октября 2010

// Вам могут понадобиться обе части -

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 голосов
/ 24 августа 2017

Самый короткий способ - создать новый объект даты с указанным годом, январь в качестве месяца и ваш день года в качестве даты:

const date = new Date(2017, 0, 365);

console.log(date.toLocaleDateString());

Что касается setDate, рассчитывается правильный месяц, если указанная дата больше длины месяца.

1 голос
/ 01 июля 2015

Вот моя реализация, которая поддерживает дробные дни. Концепция проста: получить метку времени unix полуночи первого дня года, а затем умножить нужный день на количество миллисекунд в дне.

/**
 * 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);
1 голос
/ 29 октября 2010

У вас есть несколько вариантов;

Если вы используете стандартный формат, вы можете сделать что-то вроде:

new Date(dateStr);

Если вы предпочитаете быть в безопасности, вымог бы сделать:

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

or simply,    

new Date(Date.parse(dateStr));

Или, если у вас произвольный формат, разбить строку / разобрать ее на единицы и сделать:

new Date(year, month - 1, day)

Пример последнего:

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 голосов
/ 27 августа 2016

это также работает ..

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

печатает "2016-09-13"

, что правильно, так как 2016 год является високосным.(см. календари здесь: http://disc.sci.gsfc.nasa.gov/julian_calendar.html)

0 голосов
/ 29 октября 2010

Если я правильно понимаю ваш вопрос, вы можете сделать это из конструктора Date следующим образом

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

Все аргументы в виде целых чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...