Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 时区问题将日期对象返回到Google Sheets电子表格_Date_Google Apps Script_Google Sheets - Fatal编程技术网

Date 时区问题将日期对象返回到Google Sheets电子表格

Date 时区问题将日期对象返回到Google Sheets电子表格,date,google-apps-script,google-sheets,Date,Google Apps Script,Google Sheets,我正在编写一个自定义函数,用于将从Yahoo Finance获得的财务报价返回到Google Sheets电子表格(内置的GoogleFinance()由于各种原因不会将其剪切),并且在返回包含报价日期和时间的日期对象时遇到问题。表示“工作表中的时间和日期成为应用程序脚本中的日期对象。如果电子表格和脚本使用不同的时区(这是一个罕见的问题),自定义功能将需要进行补偿”,但不清楚如何补偿 首先,我的浏览器的时区是“亚洲/香港”,即GMT+0800(HKT)。事实证明,脚本不知怎的知道这一点,因为当我

我正在编写一个自定义函数,用于将从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的权限”

这是我设法编写的笨拙的解决方案(但我希望有更好的方法):


您的电子表格的区域设置是什么?你是否在自定义函数中使用了<代码> 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;