【问题标题】:Issue with date formatting and time zone change日期格式和时区更改问题
【发布时间】:2020-11-22 08:20:51
【问题描述】:

我在 Google 表格和 Google Script 中的日期格式有一个奇怪的问题。

我正在开发一个脚本,它可以读取 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。

【问题讨论】:

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


【解决方案1】:

我用这种方法试过了,没问题:

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

对我来说似乎是正确的

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2016-01-19
      相关资源
      最近更新 更多