【问题标题】:How to convert from Google Sheet date number value to JavaScript date?如何将 Google Sheet 日期数值转换为 JavaScript 日期?
【发布时间】:2018-11-01 04:07:43
【问题描述】:

对于日期,Google 表格以大致纯数字格式给出一些数值,例如 450345。如何在 JavaScript 中将此数字转换为日期值?尝试根据其中一个创建新日期,并得到一个与 Google 表格显示日期值不对应的值。

【问题讨论】:

  • 如果可以将值转换为Date 对象,您应该能够获取Date 对象。您能否通过部分受影响单元格的屏幕截图向我们展示您如何获取值?
  • 这个帖子对您的情况有用吗? stackoverflow.com/a/15137090/7108653
  • 如果单元格是日期和时间,则 Google 表格使用自 1899 年 12 月 30 日 0:00:00 以来的数值天数,其中小数部分是一天的小数部分。当然,如果您将格式设置为日期和时间,您会看到日历日期和时间。 Javascript 从 1970 年 1 月 1 日 0:00:00 开始使用毫秒。如果您获取日期单元格的值(),则转换为毫秒会自动完成,并且它与 javascript 日期兼容。但如果你得到数值,你必须乘以 24*60*60*1000 转换为毫秒。

标签: javascript google-apps-script google-sheets


【解决方案1】:

感谢 TheWizEd 引导我找到看似正确的答案。这是一个简单的转换脚本:

function logSheetDateString(GS_date_num, timezone, format) {
    var GS_earliest_date = new Date(1899, 11, 30), 
        //GS_earliest_date gives negative time since it is before 1/1/1970
        GS_date_in_ms = GS_date_num*24*60*60*1000;
    Logger.log(Utilities.formatDate(new Date(GS_date_in_ms + GS_earliest_date.getTime()), 
                                    timezone, format));
}

自 1970 年 1 月 1 日以来到毫秒的转换可以简化为:

JS_date_in_ms = GS_date_num * 86400000 - 2209132800000;

【讨论】:

    【解决方案2】:

    您可以使用实用程序获取单元格的日期format,然后format

    var cell = sheet.getRange("C4");
    var formattedDate = Utilities.formatDate(cell.getValue(), "GMT", cell.getNumberFormat());
    Logger.log(formattedDate);
    

    记得将GMT 更改为您的时区。

    【讨论】:

      【解决方案3】:

      这些函数将 javascript 日期正确地转换为 Google 表格日期的内部表示,反之亦然。

      /**
       * @param {Number} GoogleDateValue - Days passed since dec 30 1899, time in fraction
       * @returns {Date object} - javascript date object
       *
       */
      function ValueToDate(GoogleDateValue) {
        return new Date(new Date(1899,11,30+Math.floor(GoogleDateValue),0,0,0,0).getTime()+(GoogleDateValue%1)*86400000) ;
      }
      
      /**
       * @param {Date object} - javascript date object{Number} 
       * @returns {Number} GoogleDateValue - Days passed since dec 30 1899, time in fraction
       *
       */
      
      function DateToValue(date) {
        return 25569 + (date.getTime()-date.getTimezoneOffset()*60000)/86400000 ;
      }
      

      【讨论】:

        【解决方案4】:
        function job_counter() {
        
        
          var yesterday_jobs=0;
          var ss=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
          var e = new Date(new Date().getFullYear(),new Date().getMonth() , new Date().getDate())
          var range_unformated=ss.getRange(2,3,25)
          var range = Utilities.formatDate(range_unformated.getValues(), "GMT", range_unformated.getNumberFormats())
          for (var i=1; i<25; i++){
            if ( range[i] - e <= 0 && range[i] != ""  ){
              yesterday_jobs = yesterday_jobs + 1 
            ss.getRange(16,2).setValue(yesterday_jobs)
            Logger.log(d)
            }}
            // check yesterday_jobs                       
        }
        

        我收到消息“找不到方法 formatDate(object,string,object)”

        【讨论】:

          猜你喜欢
          • 2018-05-10
          • 2021-03-20
          • 2017-04-15
          • 2020-03-19
          • 2019-06-14
          • 1970-01-01
          • 2010-12-18
          • 2021-06-07
          • 1970-01-01
          相关资源
          最近更新 更多