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()
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()