该问题很可能是由于您的代码没有观察到您想要以 HH:mm 形式呈现的日期时间值的日期部分而引起的。
您的代码从电子表格中获取日期时间值,但根据屏幕截图,该日期时间值看起来只有时间部分。这意味着日期组件将默认为电子表格纪元,即 1899 年 12 月 30 日。时区偏移在 1899 年曾经非常奇怪,因此如果省略日期部分,可能会得到令人惊讶的结果。
即使在今天,并非所有时区都是整点——世界上加拿大、澳大利亚、新西兰、印度、伊朗、阿富汗和尼泊尔等地也存在 :30 和 :45 的偏移。都柏林标准时间曾经是 UTC-00:25:21,孟买时间曾经是 UTC+04:51。马来亚和新加坡一直使用UTC+07:20作为夏令时,直到1941年。等等。
JavaScript 日期始终采用 UTC 格式,但是当您呈现它们时,它会使用日期的时区和zoneinfo https://en.wikipedia.org/wiki/Tz_database确定要使用的偏移量在特定日期日期对象反映的时区运行环境.
在 Google Apps 脚本中,运行时环境的某些属性由脚本项目设置。脚本项目有自己的时区,与托管电子表格分开,并且这两个时区可能不同。这就是为什么使用它很重要Utilities.formatDate()
和电子表格的时区向用户呈现日期时间值时。
您的代码假设GMT+1
时区,可能与电子表格的时区不同。您的时区很可能是EET
而不是GMT+1
。这两者不是一回事。目前最重要的区别是EET
遵守夏令时(EEST
) while GMT+1
才不是。 1899 年可能还存在其他差异,这可以解释您所描述的 24 分钟差异。
要获取电子表格中显示的时间值,您需要包含日期组件,并按照电子表格的时区格式化生成的日期时间,如下所示:
const dateString = wysylka.getRange('B5').getDisplayValue().replace(/^(\d+)-(\d+)-(\d+)$/, '20$3-$2-$1 ');
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');
您可能还想检查您的电子表格文件 > 设置 > 时区设置正确。请注意,更改时区将更改电子表格中日期时间值的显示方式,因此更改时区后可能需要更正它们。