Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.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
Datetime 处理日期/时间和时区的问题_Datetime_Google Apps Script_Google Sheets_Timezone - Fatal编程技术网

Datetime 处理日期/时间和时区的问题

Datetime 处理日期/时间和时区的问题,datetime,google-apps-script,google-sheets,timezone,Datetime,Google Apps Script,Google Sheets,Timezone,我正在谷歌日历上创建一系列活动,这些活动是基于链接到谷歌表单的谷歌表单上的信息。处理日期是一团乱,我得到的结果不稳定 我在电子表格上有一个字段,开始日期显示为YYYY/MM/DD 我有一个字段,其开始时间显示为HH:mm 我有一个字段,其结束时间显示为HH:mm 我理解,在内部,时间有一个年/月/日关联,日期也有一个未显示的时间关联 我最终需要使用日期中的日期部分和时间中的时间部分创建一个日历事件系列,我可以使用setHours()setMinutes()方法更改时间部分 现在我的问题是从日期单

我正在谷歌日历上创建一系列活动,这些活动是基于链接到谷歌表单的谷歌表单上的信息。处理日期是一团乱,我得到的结果不稳定

我在电子表格上有一个字段,开始日期显示为
YYYY/MM/DD

我有一个字段,其开始时间显示为
HH:mm

我有一个字段,其结束时间显示为
HH:mm

我理解,在内部,时间有一个年/月/日关联,日期也有一个未显示的时间关联

我最终需要使用日期中的日期部分和时间中的时间部分创建一个日历事件系列,我可以使用
setHours()
setMinutes()
方法更改时间部分

现在我的问题是从日期单元格值创建一个一致的日期对象,因为它看起来变化很奇怪

var ssTZ = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var SSDate = ss.getRange(6,8).getValue();
var dataStart = Utilities.formatDate(SSDate, 'America/Brasilia' , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartTZ = Utilities.formatDate(SSDate, ssTZ , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartSP = Utilities.formatDate(SSDate, 'America/Sao_Paulo' , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartOS = Utilities.formatDate(SSDate, 'GMT-3' , 'MMMM dd, yyyy 12:00:00 Z');

var date = new Date(dataStart);
var dateTZ = new Date(dataStartTZ);
var dateSP = new Date(dataStartSP);
var dateOS = new Date(dataStartOS);  

Logger.log("Spreadsheet TimeZone: " + ssTZ);
Logger.log(SSDate);
Logger.log("");
Logger.log(date);  
Logger.log(dateTZ);
Logger.log(dateSP);
Logger.log(dateOS);
该代码生成以下日志输出:

电子表格时区:美国/圣保罗
[19-07-02 20:39:49:781 BRT]2016年1月12日星期二00:00:00 GMT-02:00
[19-07-02 20:39:49:782 BRT]
[19-07-02 20:39:49:784 BRT]2016年1月12日星期二10:00:00 GMT-02:00
[19-07-02 20:39:49:784 BRT]2016年1月12日星期二12:00:00 GMT-02:00
[19-07-02 20:39:49:785 BRT]2016年1月12日星期二12:00:00 GMT-02:00
[19-07-02 20:39:49:786 BRT]2016年1月11日星期一13:00:00 GMT-02:00

这是没有意义的,因为所有使用的时区实际上应该是相同的

编辑。。。。补充信息

根据@TheMaster的要求,文本格式变量的日志包括:

  Logger.log(dataStart);  
  Logger.log(dataStartTZ);
  Logger.log(dataStartSP);
  Logger.log(dataStartOS);
[19-07-03 12:39:33:099 BRT]2016年1月12日12:00:00+0000

[19-07-03 12:39:33:100 BRT]2016年1月12日12:00:00-0200

[19-07-03 12:39:33:100 BRT]2016年1月12日12:00:00-0200

[19-07-03 12:39:33:100 BRT]2016年1月11日12:00:00-0300

@ziganotscha解释的前3个输出是由于夏季时间更改为GMT-2,美国/巴西利亚未被确认为有效时区

我仍然不明白为什么它会改为1月11日,而GMT-3被指定为时区

此外,如果直接从单元格值构建日期对象而不进行格式化,则会得到另一个不同的时间:

var rawDate = new Date(SSDate);
19-07-03 12:39:33:101 BRT]RAWT日期:2016年1月12日星期二00:00:00 GMT-0200(BRST)

我讨厌约会。。。太令人困惑了

编辑2。。。时间会带来更多问题

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Passeios");
  var timeStart = ss.getRange(6,4).getValue();
  var timeEnd = ss.getRange(6,5).getValue();
  var ssTZ = SpreadsheetApp.getActive().getSpreadsheetTimeZone();

  Logger.log("timeStart: " + timeStart );
  Logger.log("timeEnd: " + timeEnd);


  var dateStart = ss.getRange(6,8).getValue();

  var dateStartObj = new Date(Utilities.formatDate(dateStart, 'ssTZ' , 'MMMM dd, yyyy HH:mm:ss Z'));

var timeStartObj= new Date(Utilities.formatDate(timeStart, 'ssTZ' , 'MMMM dd, yyyy HH:mm:ss Z'));

var justTimeStart = Utilities.formatDate(timeStart, ssTZ, 'HH:mm');


Logger.log(" Time Start Object: " + timeStartObj);
Logger.log("Time Start Object Hours: " + timeStartObj.getHours());
Logger.log("Time Start Object Minutes: " + timeStartObj.getMinutes());

Logger.log("Start Time HH:mm: " + justTimeStart)

var hourStart = Utilities.formatDate(timeStart, ssTZ, 'HH');
var minutesStart = Utilities.formatDate(timeStart, ssTZ, 'mm');
var hourEnd = Utilities.formatDate(timeEnd, ssTZ, 'HH');
var minutesEnd = Utilities.formatDate(timeEnd, ssTZ, 'mm');


Logger.log(" TimeZone :" + ssTZ);
Logger.log(hourStart);
Logger.log(minutesStart);
Logger.log(hourEnd);
Logger.log(minutesEnd);  
生成以下日志

时间开始:1899年12月30日星期六07:06:28 GMT-0300(BRT)

时间结束:1899年12月30日星期六07:36:28 GMT-0300(BRT)

时间开始对象:1899年12月30日星期六07:06:28 GMT-0300(BRT)

时间开始对象小时数:7

时间开始对象分钟数:6

开始时间HH:mm:07:00

时区:美洲/圣保罗

07

00

07

三十

电子表格单元格的格式为HH:mm,并显示 07:00开始时间 07:30结束时间

正如您所看到的,在记录单元格值或使用单元格值构造Date()对象时,有大约6分28秒的偏移量,我不确定从何而来


将单元格格式设置为仅小时或仅分钟或HH:mm不包含该偏移量。

时区混淆:

您的时区是
“美国/圣保罗”
时区-这就是
Logger.log(dateTZ)的原因
Logger.log(dateSP)给你和你期望的一样的时间

但是,请记住,1月份圣保罗遵守巴西利亚夏季时间(
UTC)−02而不是UTC−03),这就是
Logger.log(dateSP)之间的区别所在
和comes
Logger.log(dateOS)

至于dataStart,您将其指定为时区
“America/Basilia”
,这不是时区的定义名称。这就是为什么应用程序脚本不接受该值,并为您提供
UTC+0
时区

您可以验证formatDate()是否使用Java SimpleDateFormat指定的时区:

java使用Olson时区数据库


因此,电子表格时间是

2016年1月12日星期二00:00:00 GMT-02:00

i、 例如,1月12日在时区午夜开始-距格林尼治标准时间2小时

“美国/巴西利亚”
不是有效时区,可以忽略

America/SaoèPaulo
ssTZ
作为
Utilities.formatDate()
的第二个参数都产生相同的有效日期

2016年1月12日00:00:00-0200

当偏移量为
GMT-3
时,距离格林尼治标准时间午夜为-3小时,或距离格林尼治标准时间-2时区为-1小时,则日期为

2016年1月11日23:00:00-0300

i、 前一天晚上11点

问题: 日志忽略日期的时间部分,因为您为所有日期提供了静态时间格式
12:00:00 Z
,而不是
HH:mm:ss

例如,在
GMT-3
上格式化的最后一个日期变为

2016年1月11日12:00:00-0300

调用新日期()将上述对象更改为本地时间
GMT-2
(+1自GMT-3):

2016年1月11日星期一13:00:00 GMT-02:00

请注意,强烈建议不要使用
newdate(timestring)
进行解析

参考资料:

Log
SSDate、dataStart、dataStartTZ、dataStartSP、dataStartOS
instead这是用于以下对象的日志:Logger.Log(dataStart);Logger.log(dataStartTZ);Logger.log(dataStartSP);Logger.log(dataStartOS);19-07-03 12:27:40:438 BRT]2016年1月12日12:00:00+0000[19-07-03 12:27:40:439 BRT]2016年1月12日12:00:00-0200[19-07-03 12:27:40:440 BRT]2016年1月12日12:00:00-0200[19-07-03 12:27:40:440 BRT]2016年1月11日12:00:00-0300您的脚本时区是什么?文件>项目设置?我的脚本时区是(GMT-03:00)圣保罗,但我猜我在中使用的日期