【问题标题】:how can I convert day of year to date in javascript?如何在javascript中将一年中的一天转换为日期?
【发布时间】:2010-10-29 03:06:19
【问题描述】:

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

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    “我想取一年中的某一天并使用 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
    }
    

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

    【讨论】:

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

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

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

    【讨论】:

    • 对不起.. 如果我有一年中的特定日子。例如:假设它是 1995 年的第 232 天......我怎样才能从中构造一个新的日期?
    • var d=Date.fromDayofYear(232,1995)
    【解决方案3】:

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

    可选,参数 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)

    【讨论】:

    • 警告:此解决方案存在时区问题。它有时会给出错误的答案。
    【解决方案4】:

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

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

    对于setDate,如果给定的日期大于月份的长度,则会计算出正确的月份。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果我正确理解你的问题,你可以像这样从 Date 构造函数中做到这一点

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

        所有参数都是整数

        【讨论】:

          【解决方案7】:

          你有几个选择;

          如果您使用的是标准格式,则可以执行以下操作:

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

          【讨论】:

          • 对不起.. 如果我有一年中的特定日子。例如:假设它是 1995 年的第 232 天......我怎样才能从中构造一个新的日期?
          【解决方案8】:

          这也有效..

          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

          【讨论】:

            【解决方案9】:

            如果您总是想要UTC日期:

            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

            【讨论】:

              猜你喜欢
              • 2014-08-03
              • 2011-12-18
              • 2015-01-24
              • 1970-01-01
              • 2016-02-04
              • 2021-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多