Google 从工作表中抽取时间的脚本会增加 +1 分钟

Google Script when taking time from sheets adds +1 minute

 var pickupTimeOld = wysylka.getRange("C5").getValue()
 var pickupTime = Utilities.formatDate(pickupTimeOld, "GMT+1",  'HH:mm')

我在从 google 工作表中获取值时遇到问题,例如 9:50:00,它正在将时间更改为 09:26。我找不到减去 24 分钟的地方,因为从代码来看一切都很好。 google 表的配置是否有可能造成这个问题?这个减去的原因是什么。

格式化屏幕 google 张:

问题很可能是由于您的代码没有观察到您想要呈现为 HH:mm 的日期时间值的日期部分引起的。

您的代码从电子表格中获取日期时间值,但根据屏幕截图,该日期时间值似乎只有时间部分。这意味着 日期组件将默认为电子表格纪元 ,即 1899 年 12 月 30 日。时区偏移量在 1899 年非常奇怪,因此如果您省略日期组件,您可能会得到令人惊讶的结果。

即使在今天,也不是所有的时区都是整小时——世界上有 :30 和 :45 时差,例如加拿大、澳大利亚、新西兰、印度、伊朗、阿富汗和尼泊尔。都柏林标准时间过去是 UTC-00:25:21,孟买时间过去是 UTC+04:51。马来亚和新加坡使用UTC+07:20作为夏令时直到1941年。依此类推。

JavaScript 日期始终采用 UTC,但是当您显示它们时,它会使用日期的时区和 zoneinfo 来确定要在特定日期使用的偏移量 日期对象反映在 运行时环境 .

的时区

在Google Apps 脚本中,运行时环境的某些属性由脚本项目设置。脚本项目有自己的时区,独立于托管电子表格,这两个时区可能不同。这就是为什么在向用户显示日期时间值时使用 Utilities.formatDate() 电子表格的时区 很重要。

您的代码采用 GMT+1 时区,这可能与电子表格的时区不同。您的时区很可能是 EET 而不是 GMT+1。这两个不是一回事。目前最重要的区别是 EET 遵守夏令时 (EEST) 而 GMT+1 不遵守。 1899 年可能还有其他差异,这可以解释您描述的 24 分钟差异。

要获得电子表格中显示的时间值,您需要包含日期组件,并按照电子表格的时区设置结果日期时间的格式,如下所示:

  const dateString = wysylka.getRange('B5').getDisplayValue().replace(/^(\d+)-(\d+)-(\d+)$/, '20-- ');
  const timeString = wysylka.getRange('C5').getDisplayValue();
  const datetime = new Date(dateString + timeString);
  const timezone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
  const pickupTimeString = Utilities.formatDate(datetime, timezone, 'HH:mm');

您可能还需要检查电子表格的文件 > 设置 > 时区 是否设置正确。请注意,更改时区会更改电子表格中日期时间值的显示方式,因此在您更改时区后它们可能需要更正。

试试这个:

var wysylka = SpreadsheetApp.getActiveSheet();
var pickupTimeOld = wysylka.getRange("C5").getDisplayValue();
var tz = Session.getTimeZone(); // or SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var today = Utilities.formatDate(new Date(), tz, 'yyyy-MM-dd');
var pickupTime = Utilities.formatDate(new Date(today + ' ' + pickupTimeOld), tz, 'HH:mm');

可能在您的情况下,以这种方式定义 today 是有意义的:

var today = wysylka.getRange("B5").getDisplayValue()