3

Google 的 createEventSeries 示例(如下所示)中,Date 值以“EST”结尾指定。但是,我想指定重复事件的日期(请参阅此答案中的类型#4),例如,“每周一晚上 9 点,即使 DST 更改。” 假设我可以确定哪一天是我经常性事件的第一个星期一。问题是我如何指定当天晚上 9 点应该考虑 DST 是否生效?

使用时区名称 (Olson ID) 来指定日期会很直观,例如,使用示例中的日期“2010 年 7 月 21 日 09:00:00 America/Montreal ”。如果我在 Google Apps 脚本中尝试,生成的日期在 1969 年有一个虚假值。

我如何new Date()在 Google Apps 脚本中指定 a 以便它了解我指定的 Olson ID,例如“America/Montreal”,而不是让我先验地知道日期是否实际上是“EST”或“EDT”?

// 下面的代码将向用户的默认日历添加一个每隔一天重复一次的事件
var cal = CalendarApp.getDefaultCalendar(); cal.createEvent("忙碌", new Date("2010 年 7 月 21 日 08:00:00 EST"), new Date("2010 年 7 月 21 日 09:00:00 EST"), CalendarApp.newRecurrence().addDailyRule( ).interval(2), {location:'Nap room'});`

ps 我找到了一种解决方法/hack,它依赖于 GAS 中的 JavaScript new Date() 将继承脚本的时区的信息(参见第 4 个要点)。我可以将脚本的时区设置为我想要创建重复事件的时区,并且它似乎可以工作。但我不想依赖这个细节,因为它看起来很脆弱。

编辑

下面是一个小测试的输出,使用该变通方法向您展示它是如何工作的。请注意GMT-0500 (EST)如何更改为GMT-0400 (EDT)

功能短测试(){
  // DST 于 2012 年 3 月 10 日在“美国/蒙特利尔”(Olson ID)开始
  // 此脚本的项目属性显示时区(今天,2012 年 12 月 18 日)
  // "(GMT-05:00) 东部时间 - 蒙特利尔"
  Logger.log("日期 = " + (new Date("2013 年 3 月 9 日 21:00:00")));
  Logger.log("日期 = " + (new Date("2013 年 3 月 10 日 21:00:00")));
  Logger.log("日期 = " + (new Date("2013 年 3 月 11 日 21:00:00")));
}

记录器输出

日期 = 2013 年 3 月 9 日星期六 21:00:00 GMT-0500 (EST)
日期 = 2013 年 3 月 10 日星期日 21:00:00 GMT-0400 (EDT)
日期 = 2013 年 3 月 11 日星期一 21:00:00 GMT-0400 (EDT)
4

1 回答 1

0

如何在 Google Apps 脚本中指定一个新的 Date() 以便它了解我指定的 Olson ID

您可以使用Session.getTimeZone()Calendar#getTimeZone来获取一个可正确解释的字符串,该字符串分别表示脚本或日历的时区 ID。

另请参阅Errors with Utilties.FormatDate的答案,它指的是相关的基础TimeZone Java doc

您可以在 UTC 中指定您的核心日期/时间,然后通过 Utilities.formatDate 将其显示在您想要的时区,但这并不能回答您的问题。

对于您的问题的核心,问题是没有查找表或函数可以将 GMT 偏移量转换为时区字符串,除非您使用操作系统维护者维护的操作系统深处的那个。Javacript 的Date工作方式是使用本地计算机的时区(在我们的例子中,GAS 服务器的时区可以通过脚本的时区项目属性设置进行更改,如您所见),或者您可以直接在Date构造函数上指定 GMT 偏移量。

因此,在使用 Date() 构造函数创建日期/时间时,您需要 a) 选择要使用的 GMT 偏移量或 b) 接受脚本的项目设置时区。

于 2012-12-18T05:53:41.860 回答