在Google's example for createEventSeries(如下所示)中,Date值在末尾用“EST”指定。但是,我想指定recurring event (see type #4 of the kinds of times in this answer)的日期,例如“每周一晚上9点,即使DST更改”。假设我可以找出哪一天是我的重复活动的第一个星期一。问题是如何指定当天晚上9点应考虑DST是否有效?
使用时区名称(Olson ID)指定日期是直观的,例如,使用示例中的日期,“2010年7月21日09:00:00 America / Montreal ”。如果我在Google Apps脚本中试用,则生成的日期在1969年会出现虚假值。
如何在Google Apps脚本中指定new Date()
,以便查看我指定的Olson ID,例如“America / Montreal”,而不是我知道日期是否实际为“EST”或“EDT”?
// The code below will add an event to the user's default Calendar that recurs every other day var cal = CalendarApp.getDefaultCalendar(); cal.createEvent("Busy", new Date("July 21, 2010 08:00:00 EST"), new Date("July 21, 2010 09:00:00 EST"), CalendarApp.newRecurrence().addDailyRule().interval(2), {location:'Nap room'});`
P.S。我发现了一个依赖the information that JavaScript new Date() in GAS will inherit the timezone of the script (see the 4th bullet point)的解决方法/黑客攻击。我可以将脚本的时区设置为我想要创建定期事件的时区,并且它似乎有效。但我不想依赖这个细节,因为它似乎很脆弱。
修改
这是使用变通方法的小测试的输出,向您展示它是如何工作的。注意 GMT-0500(EST)如何变为 GMT-0400(EDT)。
function shortTest() { // DST begins on Mar 10, 2012 in "America/Montreal" (Olson ID) // This script's Project Properties show a Time zone (today, Dec 18, 2012) of // "(GMT-05:00) Eastern Time - Montreal" Logger.log("Date = " + (new Date("March 9, 2013 21:00:00"))); Logger.log("Date = " + (new Date("March 10, 2013 21:00:00"))); Logger.log("Date = " + (new Date("March 11, 2013 21:00:00"))); }
记录器输出
Date = Sat Mar 09 2013 21:00:00 GMT-0500 (EST) Date = Sun Mar 10 2013 21:00:00 GMT-0400 (EDT) Date = Mon Mar 11 2013 21:00:00 GMT-0400 (EDT)
答案 0 :(得分:0)
如何在Google Apps脚本中指定新的Date(),以便显示我指定的Olson ID
您可以使用Session.getTimeZone()或Calendar#getTimeZone来获取正确可解释的字符串,该字符串分别代表脚本或日历的时区ID。
另请参阅Errors with Utilties.FormatDate的答案,该答案涉及相关的基础TimeZone Java doc。
您可以用UTC指定核心日期/时间,然后通过Utilities.formatDate以您想要的时区显示它,但不能回答您的问题。
问题的核心问题是,没有查找表或功能可以将GMT偏移转换为时区字符串,除非您在OS维护人员维护的操作系统中使用深度字符串。 Javacript Date
的工作方式是使用本地计算机的时区(在我们的例子中,您可以通过脚本的时区项目属性设置改变GAS服务器),或者您可以指定GMT偏移直接在Date
构造函数上。
因此,在使用Date()构造函数创建日期/时间时,您需要a)选择要使用的GMT偏移量,或b)接受脚本的项目设置时区。