如何在javascript中将一年中的某一天转换为日期?

IT技术 javascript date
2021-02-23 04:20:03

我想取一年中的一天并使用 Date 对象转换为实际日期。示例:1929 年第 257 天,我该怎么做?

6个回答

“我想使用 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
}

您还可以添加一些验证,以确保天数在提供的年份中的天数范围内。

或者更短:return new Date(year, 0, day). ;-)
2021-04-25 04:20:03
正如@med116 所说——仔细测试。使用这个答案我得到了一些非常奇怪的结果。
2021-04-30 04:20:03
根据文档是正确的:w3schools.com/jsref/jsref_setdate.asp “如果一个月有 31 天:32 将导致下个月的第一天”
2021-05-05 04:20:03
@MitchHaile,它应该有效,med116 说的不对。你能分享一下奇怪的结果吗?通常,由于时区差异,日期操作函数会出现奇怪的结果。
2021-05-09 04:20:03
setDate() 只接受 0-30 月份的数字,所以我认为人们在没有完全测试的情况下一直在投票。在底部查看我的答案以查看替代功能。(我有一个巴特辛普森头像)
2021-05-21 04:20:03

// 您可能需要它的两个部分-

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
*/
var d=Date.fromDayofYear(232,1995)
2021-04-22 04:20:03
对不起.. 意思是如果我有一年中的某个特定日子。例如:假设它是 1995 年的第 232 天……我如何从中构建一个新的日期?
2021-05-04 04:20:03

这是一个函数,它接受一个天数,并返回日期对象

可选地,参数 2 需要 YYYY 格式的年份。如果不设置它,它将默认为当前年份。

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 OF DAY 232 of year 1995

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

过去日期:1995 年 8 月 20 日星期日 09:47:18 GMT-0400 (EDT)

警告:此解决方案存在时区问题。它有时会给出错误的答案。
2021-04-21 04:20:03

最短的方法是使用给定的年份创建一个新的日期对象,一月作为月份,一年中的某一天作为日期:

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

console.log(date.toLocaleDateString());

至于setDate正确的月份如果给定的日期早于一个月的长度更大的被计算。

这是我的实现,它支持小数天数。概念很简单:获取一年中第一天午夜的 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);