在新Date()中指定Olson ID

时间:2012-12-18 02:34:23

标签: javascript timezone google-apps-script google-calendar-api

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)

1 个答案:

答案 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)接受脚本的项目设置时区。