Date 时区问题将日期对象返回到Google Sheets电子表格
我正在编写一个自定义函数,用于将从Yahoo Finance获得的财务报价返回到Google Sheets电子表格(内置的GoogleFinance()由于各种原因不会将其剪切),并且在返回包含报价日期和时间的日期对象时遇到问题。表示“工作表中的时间和日期成为应用程序脚本中的日期对象。如果电子表格和脚本使用不同的时区(这是一个罕见的问题),自定义功能将需要进行补偿”,但不清楚如何补偿 首先,我的浏览器的时区是“亚洲/香港”,即GMT+0800(HKT)。事实证明,脚本不知怎的知道这一点,因为当我使用d=new Date(2016,5,24,0,0,0,0)和d.toString()格式化一个日期对象时,我得到了“Wed Jun 24 2016 00:00:00 GMT+0800(HKT)”。这是很奇怪的,因为StudieSeppApp.GeActudiePrimeDeStEd().GETSPRead SueTimeTimeOne()实际上返回“美国/LoSojales”,表示服务器位于美国西海岸:为什么服务器端运行的方法toStruts()会根据香港时间格式化日期?对我来说这听起来像个虫子 无论如何,我遇到的最大问题是,当自定义函数将日期对象返回到电子表格时,如果我使用格式->数字->日期时间对单元格进行格式化,我看到显示的是“23/06/2016 09:00:00”,即日期和时间<美国西海岸>强>香港日期和时间是我通过传递给构造函数的参数所指定的日期(对应于6月24日2016时00分00分)。 然后我尝试使用新日期(Date.UTC(2016,5,24,0,0,0,0,0))构建日期对象,但是(可以预见的是)现在电子表格显示“23/06/2016 17:00:00”,这是西海岸的日期和时间,UTC日期和时间是我指定的日期和时间 那么,如何获得一个日期对象,一旦返回到电子表格,它将显示与我构建它时完全相同的日期和时间?我尝试使用ss.setSpreadsheetTimeZone(“Etc/UTC”)将电子表格的时区更改为UTC,但不幸的是,脚本返回错误“您没有调用setSpreadsheetTimeZone的权限” 这是我设法编写的笨拙的解决方案(但我希望有更好的方法):Date 时区问题将日期对象返回到Google Sheets电子表格,date,google-apps-script,google-sheets,Date,Google Apps Script,Google Sheets,我正在编写一个自定义函数,用于将从Yahoo Finance获得的财务报价返回到Google Sheets电子表格(内置的GoogleFinance()由于各种原因不会将其剪切),并且在返回包含报价日期和时间的日期对象时遇到问题。表示“工作表中的时间和日期成为应用程序脚本中的日期对象。如果电子表格和脚本使用不同的时区(这是一个罕见的问题),自定义功能将需要进行补偿”,但不清楚如何补偿 首先,我的浏览器的时区是“亚洲/香港”,即GMT+0800(HKT)。事实证明,脚本不知怎的知道这一点,因为当我
您的电子表格的区域设置是什么?你是否在自定义函数中使用了<代码> SETSPReSeTimeTimeStult?我的电子表格的时区设置为香港时间,但我希望有一个函数,不管怎样,总是返回由雅虎财经(指股票交易所的时区)作为文本字符串获得的日期。而且,正如我所说,当我调用
setSpreadsheetTimeZone()
时,我会得到一个错误“您没有调用setSpreadsheetTimeZone的权限”。最后,我通过创建日期对象来消除香港时区,该日期对象有“代码>新日期(日期。UTC())<代码>,而西海岸时区减去了从<代码> GETSPReSeTimeTimeZONE()/代码>中获得的偏移量,但它看起来像一个装饰品。
// hours and minutes contain values obtained from the text quote; the date is in the string variable:
// date_str = "05/24/2016";
var tz = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(); // this returns the TZ of the server, "America/Los_Angeles"
var ums = Date.parse(date_str+" UTC");
var offset = Date.parse(Utilities.formatDate(new Date(ums), tz, "MM/dd/yyyy HH:mm:ss") + " UTC") - ums; // time in LA - UTC time in ms
var d = new Date(Date.parse(date_str));
d = new Date(Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),hours,minutes,d.getSeconds())-offset);
return d;