Google脚本/JavaScript在时区之间转换时间
我经常旅行,我经常有从一个时区开始到另一个时区结束的约会(比如航班)。我需要知道每个活动开始和结束的本地时间和UTC时间 我使用谷歌日历,并在日历事件中指定不同的开始和结束时区 我写了一个脚本,在给定的时间段内拉动我的议程,它显示了我当地时间的一切,这很好 我很难知道当地时间 当我检索事件时,时间显示在我的本地时间中 我可以检索欧洲/罗马等格式的时区,但这无助于显示本地时间 附件是我日历中一个条目的屏幕截图: 下面是如何从我的脚本(取自日志文件)中查看事件: 这些时间应分别为开始时间:17:35和结束时间:00:30Google脚本/JavaScript在时区之间转换时间,javascript,datetime,google-apps-script,timezone,google-calendar-api,Javascript,Datetime,Google Apps Script,Timezone,Google Calendar Api,我经常旅行,我经常有从一个时区开始到另一个时区结束的约会(比如航班)。我需要知道每个活动开始和结束的本地时间和UTC时间 我使用谷歌日历,并在日历事件中指定不同的开始和结束时区 我写了一个脚本,在给定的时间段内拉动我的议程,它显示了我当地时间的一切,这很好 我很难知道当地时间 当我检索事件时,时间显示在我的本地时间中 我可以检索欧洲/罗马等格式的时区,但这无助于显示本地时间 附件是我日历中一个条目的屏幕截图: 下面是如何从我的脚本(取自日志文件)中查看事件: 这些时间应分别为开始时间:17:3
有人对如何获取当地时间或在时区之间转换有什么想法吗?希望这能对您有所帮助
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名称:'+rngA[i].getName();
s+='
颜色:'+rngA[i].getColor()+';
s+='
说明:'+rngA[i].getDescription();
var pri=(rngA[i].isMyPrimaryCalendar())?“是”:“否”;
s+='
是主日历:'+pri+'';
s++='#Cal'+i++'{背景色:'+rngA[i].getColor()++';填充:10px;}';
}
var now=新日期();
var-ForWeeksFromNow=新日期(now.getTime()+(28*24*60*60*1000));
var events=CalendarApp.getDefaultCalendar().getEvents(现在,ForWeekFromNow);
对于(var j=0;j 标题:'+events[j].getTitle();
s+='
开始:'+实用程序.formatDate(事件[j].getStartTime(),“GMT-7”,“mm-dd-HH:mm”);
s+='
结束:'+Utilities.formatDate(事件[j].getEndTime(),“GMT-7”,“MMM dd HH:mm”);
s+=''+事件[j].getDescription()+'';
s+='';
}
s+='
';
var title='Calendar for:'+Utilities.formatDate(现在是“GMT-7”,“E MMM dd,yyyy”);
显示状态(标题为“”+s+””,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);
}