Google脚本/JavaScript在时区之间转换时间

Google脚本/JavaScript在时区之间转换时间,javascript,datetime,google-apps-script,timezone,google-calendar-api,Javascript,Datetime,Google Apps Script,Timezone,Google Calendar Api,我经常旅行,我经常有从一个时区开始到另一个时区结束的约会(比如航班)。我需要知道每个活动开始和结束的本地时间和UTC时间 我使用谷歌日历,并在日历事件中指定不同的开始和结束时区 我写了一个脚本,在给定的时间段内拉动我的议程,它显示了我当地时间的一切,这很好 我很难知道当地时间 当我检索事件时,时间显示在我的本地时间中 我可以检索欧洲/罗马等格式的时区,但这无助于显示本地时间 附件是我日历中一个条目的屏幕截图: 下面是如何从我的脚本(取自日志文件)中查看事件: 这些时间应分别为开始时间:17:3

我经常旅行,我经常有从一个时区开始到另一个时区结束的约会(比如航班)。我需要知道每个活动开始和结束的本地时间和UTC时间

我使用谷歌日历,并在日历事件中指定不同的开始和结束时区

我写了一个脚本,在给定的时间段内拉动我的议程,它显示了我当地时间的一切,这很好

我很难知道当地时间

当我检索事件时,时间显示在我的本地时间中

我可以检索欧洲/罗马等格式的时区,但这无助于显示本地时间

附件是我日历中一个条目的屏幕截图:

下面是如何从我的脚本(取自日志文件)中查看事件:

这些时间应分别为开始时间:17:35和结束时间:00:30


有人对如何获取当地时间或在时区之间转换有什么想法吗?

希望这能对您有所帮助

function timezones()
{
  var today = new Date();
  var hour = 3600000;
  var tz = '';
  today = new Date(today.getTime() + (13 * hour));
  var s = '<div id="mydiv">';
  for(var i = 12;  i >= -11; i--)
  {
    if(i > 0){ tz = 'GMT+' + i;}
    if(i == 0){tz = 'GMT';}
    if(i < 0){tz = 'GMT' + i;}
    today = new Date(today.getTime() - hour);
    s += '<div class="myDates">' + Utilities.formatDate(today,"GMT", "'Date:'yyyy-MM-dd' Time:'HH:mm:ss") + 'TimeZone; "' + tz + '"</div>';
  }
  s += '</div>';
  dispStatus('Timezones', s);
}
功能时区()
{
var today=新日期();
var小时=3600000;
var tz=“”;
今天=新日期(today.getTime()+(13*hour));
var s='';
对于(变量i=12;i>=-11;i--)
{
如果(i>0){tz='GMT+'+i;}
如果(i==0){tz='GMT';}
如果(i<0){tz='GMT'+i;}
today=新日期(today.getTime()-hour);
s+=''+Utilities.formatDate(今天,格林尼治标准时间,“'Date:'yyyy-MM-dd'时间:'HH:MM:ss”)+”时区;“+tz+”;
}
s+='';
显示状态(“时区”);
}
这是我使用的显示例程

function dispStatus(title,html,width,height,modal)
{
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 400;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var modal = typeof(modal) !== 'undefined' ? modal : false;
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
 if(!modal)
 {
   SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
 }
 else
 {
   SpreadsheetApp.getUi().showModalDialog(htmlOutput, title);
 }
} 
函数dispStatus(标题、html、宽度、高度、模态)
{
var title=typeof(title)!=“未定义”?title:“未提供标题”;
变量宽度=类型(宽度)!=“未定义”?宽度:400;
变量高度=类型(高度)!=“未定义”?高度:300;
var html=typeof(html)!=“未定义”?html:“未提供html。

”; var modal=typeof(modal)!=‘未定义’?modal:false; var htmlOutput=HtmlService .createHtmlOutput(html) .setWidth(宽度) .设置高度(高度); 如果(!模态) { SpreadsheetApp.getUi().showModelessDialog(htmlOutput,标题); } 其他的 { SpreadsheetApp.getUi().showModalDialog(htmlOutput,标题); } }
并且是一个时区地图。

日历播放
<h1>Calendar Play</h1>
function calendarTesting()
    {

  var rngA = CalendarApp.getAllOwnedCalendars();
  var s='';
  for(var i = 0;i < rngA.length; i++)
  {
    s += '<div id="Cal' + i + '"><Strong>Name: </strong>' + rngA[i].getName();
    s += '<br /><strong>Color: </strong><span style="color:'+ 'black' +';">' + rngA[i].getColor() + '</span>';
    s += '<br /><strong>Description: </strong>' + rngA[i].getDescription();
    var pri = (rngA[i].isMyPrimaryCalendar())? 'Yes': 'No';
    s += '<br /><strong>IsMyPrimaryCalender: </strong>' + pri + '</div>';
    s += '<style>#Cal'+ i +'{background-color:'+ rngA[i].getColor() +';padding:10px;}</style>';

  }
  var now = new Date();
  var ForWeeksFromNow = new Date(now.getTime() + (28 * 24 * 60 * 60 * 1000));
  var events = CalendarApp.getDefaultCalendar().getEvents(now,ForWeeksFromNow);
  for(var j = 0; j < events.length; j++)
  {
    s+= '<div style="border:1px solid black;padding:10px 50px 10px 10px;">';
    s += '<div style="float:right;font-size:48px;">' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "E") + '</div>';
    s += '<br /><strong>Title: </strong>' + events[j].getTitle();
    s += '<br /><strong>Start: </strong>' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "MMM dd HH:mm");
    s += '<br /><strong>End: </strong>' + Utilities.formatDate(events[j].getEndTime(), "GMT-7", "MMM dd HH:mm");
    s += '<div style="float:right;font-size:12px;">' + events[j].getDescription() + '</div>';
    s += '</div>';

  }
  s += '<br /><br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
  var title = 'Calendar for: ' + Utilities.formatDate(now, "GMT-7", "E MMM dd, yyyy");
  dispStatus(title, '<p>' + s + '</p>',600,500);
}

function dispStatus(title,html,width,height)
{
// Display a modeless dialog box with custom HtmlService content.
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 250;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
  SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
} 
函数测试() { var rngA=CalendarApp.getAllowedCalendars(); var s=''; 对于(变量i=0;i”,600500); } 函数dispStatus(标题、html、宽度、高度) { //显示具有自定义HtmlService内容的无模式对话框。 var title=typeof(title)!=“未定义”?title:“未提供标题”; 变量宽度=类型(宽度)!=“未定义”?宽度:250; 变量高度=类型(高度)!=“未定义”?高度:300; var html=typeof(html)!=“未定义”?html:“未提供html。

”; var htmlOutput=HtmlService .createHtmlOutput(html) .setWidth(宽度) .设置高度(高度); SpreadsheetApp.getUi().showModelessDialog(htmlOutput,标题); }
显示脚本的几行。脚本中的任何日期代码都使用脚本的时区作为默认值。您的脚本有自己的时区,该时区与日历时区分开。默认情况下,时区是相同的,除非您更改它们。在哪里显示脚本中的时间?在对话框或边栏中?在电子表格中?嗨,桑迪,谢谢你的回复。我想我问得不太好。我的日期格式为
2017-03-30T01:01:00+01:00
,时区为
Asia/Qatar
。我想在电子表格中显示时间为
03:01
,这是约会发生时在卡塔尔的时间。从我的脚本返回的时间是在我的日历的本地时间,这很好。我需要根据事件发生的时区进行调整。不同的夏令时开始和结束日期以及规则会变得很困难,因此我真的想说,给定日期的
Asia/Qatar
是GMT+/-X小时。我首先让您查看可能会自动处理夏令时问题的
Utilities.formatDate()
文档,这样你就不需要自己编程了。谢谢它使用三个字母的时区,例如GMT、PST等,或者使用偏移量,例如+6。不幸的是,谷歌日历用户使用的时区格式是“亚洲/卡塔尔”(即“AST”或“+3”)。我需要从一个动态转换到另一个:(你需要一个长文本格式的所有时区的列表吗?我在浏览器开发工具中查看了HTML中的日历设置,得到了一个列表。如果你认为可能的话,我得到了这个列表。)
<h1>Calendar Play</h1>
function calendarTesting()
    {

  var rngA = CalendarApp.getAllOwnedCalendars();
  var s='';
  for(var i = 0;i < rngA.length; i++)
  {
    s += '<div id="Cal' + i + '"><Strong>Name: </strong>' + rngA[i].getName();
    s += '<br /><strong>Color: </strong><span style="color:'+ 'black' +';">' + rngA[i].getColor() + '</span>';
    s += '<br /><strong>Description: </strong>' + rngA[i].getDescription();
    var pri = (rngA[i].isMyPrimaryCalendar())? 'Yes': 'No';
    s += '<br /><strong>IsMyPrimaryCalender: </strong>' + pri + '</div>';
    s += '<style>#Cal'+ i +'{background-color:'+ rngA[i].getColor() +';padding:10px;}</style>';

  }
  var now = new Date();
  var ForWeeksFromNow = new Date(now.getTime() + (28 * 24 * 60 * 60 * 1000));
  var events = CalendarApp.getDefaultCalendar().getEvents(now,ForWeeksFromNow);
  for(var j = 0; j < events.length; j++)
  {
    s+= '<div style="border:1px solid black;padding:10px 50px 10px 10px;">';
    s += '<div style="float:right;font-size:48px;">' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "E") + '</div>';
    s += '<br /><strong>Title: </strong>' + events[j].getTitle();
    s += '<br /><strong>Start: </strong>' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "MMM dd HH:mm");
    s += '<br /><strong>End: </strong>' + Utilities.formatDate(events[j].getEndTime(), "GMT-7", "MMM dd HH:mm");
    s += '<div style="float:right;font-size:12px;">' + events[j].getDescription() + '</div>';
    s += '</div>';

  }
  s += '<br /><br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
  var title = 'Calendar for: ' + Utilities.formatDate(now, "GMT-7", "E MMM dd, yyyy");
  dispStatus(title, '<p>' + s + '</p>',600,500);
}

function dispStatus(title,html,width,height)
{
// Display a modeless dialog box with custom HtmlService content.
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 250;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
  SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
}