日期格式和时区更改问题

时间:2020-08-01 20:06:45

标签: datetime google-apps-script google-sheets timezone date-formatting

我在使用Google表格和Google脚本中的日期格式时遇到了一个奇怪的问题。

我正在开发一个脚本,该脚本读取Google工作表中的日期列表,然后将自动电子邮件发送给收件人列表。我在电子表格中有一个单元格,其日期格式为“ dd / mm / yyyy”,然后使用以下公式(单元格+ 7,单元格+ 14,单元格+ 21,单元格+ 28等)来生成电子表格中的所有其他日期。

我使用以下代码读取电子表格中的日期:

var sheet = SpreadsheetApp.getActiveSheet();
var drng = sheet.getDataRange();
var rng = sheet.getRange(4, 2, drng.getLastRow()-3, drng.getLastColumn());
var rngData = rng.getValues();

  
  var todayDate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy");

  // CYCLE THROUGH DATA
  
  for (var i = 0; i < rngData.length; i++) {   // cycle through the rows in the spreadsheet
  
    var ptLastName = rngData[i][0];     // fixed patient data used to email customization
    var ptFirstName = rngData[i][1];
    var ptDoB = Utilities.formatDate(rngData[i][2], "GMT+1", "dd/MM/yyyy");
    var ptSex = rngData[i][3];
    var ptEmail = rngData[i][4];
    var ptDoS = Utilities.formatDate(rngData[i][5], "GMT+1", "dd/MM/yyyy");
    var ptDoD = Utilities.formatDate(rngData[i][6], "GMT+1", "dd/MM/yyyy");

    for (var j = 7; j <= 14; j++) {   //  cycle through follow-up data for the current patient
      
      var currentDate = Utilities.formatDate(rngData[i][j], "GMT+1", "dd/MM/yyyy");
      
      if (currentDate == todayDate) {   // send email with the questionnaire
        
         writeEmail(ptFirstName, ptLastName, ptSex, ptDoD, ptEmail);
         rng.getCell(i+1, j+1).setBackground("yellow");
      }
      
      
    }
    
  }

问题在于,当我尝试读取和格式化某些日期时,它们与电子表格中列出的日期不对应。我注意到,代码中的错误日期通常比电子表格中列出的日期早1天。仔细观察后,我注意到从电子表格中读取的某些日期是GMT + 2,而其他日期是GMT + 1。

这很奇怪,因为我已经检查了系统设置(GMT + 1)和电子表格设置(GMT + 1)。所以我不明白为什么有些日期会自动转换为GMT + 2。

2 个答案:

答案 0 :(得分:0)

我以这种方式尝试过,并且效果很好:

function dattest() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const rg=sh.getDataRange();
  const vs=rg.getValues()[0];
  vs.forEach(function(d){
    Logger.log(Utilities.formatDate(new Date(d),Session.getScriptTimeZone(),"dd/MM/yyyy"));
  });
}

显示值:

8/1/2020,8/8/2020,8/15/2020,8/22/2020

公式:

,=A1+7,=A1+14,=a1+21

视图执行的输出:

Aug 1, 2020, 2:52:37 PM Info    01/08/2020
Aug 1, 2020, 2:52:37 PM Info    08/08/2020
Aug 1, 2020, 2:52:37 PM Info    15/08/2020
Aug 1, 2020, 2:52:37 PM Info    22/08/2020

似乎对我来说正确

答案 1 :(得分:0)

感谢您的帮助。 我终于发现了问题所在。 电子表格中的日期存储为dd / mm / yyyy,系统会自动为它们添加00.00.00作为时间。结果,当我尝试使用代码读取某些日期时,由于夏令时的调整,其中一些日期被转换为前一天。我设法解决了所有日期增加一天1/3的问题。通过这种方式,它们被存储为dd / mm / yyyy 8.00.000 am,并且一年四季都保持同一天。