如何将 Google Sheet 日期数值转换为 JavaScript 日期?

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于如何将 Google Sheet 日期数值转换为 JavaScript 日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Google Visualization API的日期列转换为JSON格式

SQL中如何将数值格式的20110801(2011年8月01日)转换为日期格式的201108或者2011-08?

如何将时间戳日期转换为整数值

如何使用R将当前日期添加到Google工作表名称中?

如何将字符串日期列转换为 Google 大查询中的日期列?

如何将excel中的三列数值转换成一列日期