Apps Script调用getDateCreated()返回文件创建时间晚1小时问题
问题现象
在Apps Script中调用Google Drive接口的getDateCreated()方法获取文件创建时间,写入Google表格时返回值比实际本地创建时间晚1小时:测试场景下文件实际创建时间为25/06/2022 22:48:39,代码返回值为25/06/2022 23:48:39,本地时区为UTC-5。
复现代码如下:
var folder = DriveApp.getFolderById(myFolderId); var contents = folder.getFiles(); var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var var_file; var var_name; var var_link; var var_owner; var var_time; while(contents.hasNext()){ var_file = contents.next(); var_name = var_file.getName(); var_link = var_file.getUrl(); var_owner = var_file.getOwner().getName(); var_time = var_file.getDateCreated(); sheet.appendRow([var_name,var_link,var_owner, var_time]); }
偏差原因
getDateCreated() 返回的Date对象存储的是标准UTC时间戳,本身数值完全准确,1小时偏差完全来自时区配置和夏令时的适配问题:
- 标注的UTC-5时区在6月属于夏令时生效时段,实际本地时间偏移为UTC-4,比冬令时标准时间快1小时。
- 如果Google表格、Apps Script项目的时区配置选了固定偏移的UTC-5,而非带自动夏令时适配的地区时区,写入Date对象时就会固定按UTC-5做时间转换,刚好和夏令时的实际本地时间差1小时,和遇到的现象完全匹配。
修复方案
方案1:全局时区配置对齐(推荐,一劳永逸)
- 打开目标Google表格,点击顶部菜单栏「文件」-「设置」,在常规设置页的时区选项中,选择对应地区带自动夏令时适配的时区(例如美东地区选择「美国/纽约」,不要选择固定偏移的UTC-5选项),保存设置。
- 打开关联的Apps Script项目,点击左侧边栏设置按钮(齿轮图标),勾选「显示appsscript.json清单文件」选项,回到编辑器打开
appsscript.json文件,将timeZone字段值修改为和表格完全一致的地区时区ID,示例配置:
{ "timeZone": "America/New_York", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8" }
配置完成后重新运行脚本,时间会自动适配夏令时偏移,不会再出现1小时偏差。
方案2:代码层面指定时区格式化(适合不需要改全局配置的场景)
如果不希望修改表格和项目的全局时区配置,可以在写入表格前,手动调用Utilities.formatDate()方法,指定带夏令时适配的地区时区对时间做格式化,替换原有直接写入Date对象的逻辑即可,修改后的循环代码段如下:
while(contents.hasNext()){ var_file = contents.next(); var_name = var_file.getName(); var_link = var_file.getUrl(); var_owner = var_file.getOwner().getName(); var_time = var_file.getDateCreated(); // 第二个参数替换为自身所在地区对应的IANA时区ID var formattedTime = Utilities.formatDate(var_time, "America/New_York", "dd/MM/yyyy HH:mm:ss"); sheet.appendRow([var_name,var_link,var_owner, formattedTime]); }
注意:不要使用GMT-5这类固定偏移值作为格式化方法的时区参数,固定偏移不会自动适配每年夏令时、冬令时的切换,时制切换节点会再次出现1小时偏差,必须使用IANA标准地区时区ID。
内容的提问来源于stack exchange,提问作者Rothman Mariño
相关产品推荐
相关产品推荐

