3

Google の createEventSeries の例(以下を参照) では、Date 値は末尾に「EST」を付けて指定されています。ただし、定期的なイベントの日付を指定したい(この回答の種類の時間のタイプ #4 を参照)、たとえば、「DST が変更された場合でも、毎週月曜日の午後 9 時」などです。定期的なイベントの最初の月曜日を特定できるとします。問題は、その日の午後 9 時に DST が適用されているかどうかを考慮するように指定するにはどうすればよいかということです。

たとえば、「2010 年 7 月 21 日 09:00:00アメリカ/モントリオール」の例の日付を使用して、タイム ゾーン名 (Olson ID) を使用して日付を指定することは直感的です。Google Apps Script で試してみると、結果の Date は 1969 年に偽の値になります。

new Date()日付が実際に「EST」または「EDT」であるかどうかをアプリオリに知っているのではなく、指定した Olson ID、たとえば「アメリカ/モントリオール」を取得するように、Google Apps Script でを指定するにはどうすればよいですか?

// 以下のコードは、1 日おきに繰り返されるユーザーのデフォルトのカレンダーにイベントを追加します
var cal = CalendarApp.getDefaultCalendar(); cal.createEvent("Busy", new Date("2010 年 7 月 21 日 08:00:00 EST"), new Date("2010 年 7 月 21 日 09:00:00 EST"), CalendarApp.newRecurrence().addDailyRule( .interval(2), {location:'仮眠室'});`

ps GAS の JavaScript new Date() がスクリプトのタイムゾーンを継承するという情報に依存する回避策/ハックを見つけました(4 番目の箇条書きを参照) 。スクリプトのタイムゾーンを、定期的なイベントを作成したいタイムゾーンに設定すると、うまくいくように見えます。しかし、壊れやすいように見えるので、この詳細に依存したくありません.

編集

以下は、回避策を使用した小さなテストの出力で、その動作を示しています。GMT-0500 (EST)がGMT-0400 (EDT)にどのように変化するかに注意してください。

関数 shortTest() {
  // DST は 2012 年 3 月 10 日に「アメリカ/モントリオール」で始まります (オルソン ID)
  // このスクリプトのプロジェクト プロパティは、タイム ゾーン (今日、2012 年 12 月 18 日) を示しています
  // "(GMT-05:00) 東部時間 - モントリオール"
  Logger.log("Date = " + (new Date("2013 年 3 月 9 日 21:00:00")));
  Logger.log("Date = " + (new Date("2013 年 3 月 10 日 21:00:00")));
  Logger.log("Date = " + (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

How can I specify a new Date() in Google Apps Script such that it groks the Olson ID I specify

You can use Session.getTimeZone() or Calendar#getTimeZone to get a correctly interpretable string that represents the timezone id of the script or calendar respectively.

See also the answer to Errors with Utilties.FormatDate which refers to the relevant underlying TimeZone Java doc.

You could specify your core date/time in UTC and then display it in the timezone you want via Utilities.formatDate but that doesn't answer your question.

To the heart of your question, the problem is there's no lookup table or function to convert GMT offsets to timezone strings unless you use the one deep in your operating system maintained by the OS maintainer. The way Javacript Date works is that is uses the local computer's time zone (in our case the GAS server's that you can alter via the script's Time Zone project property setting as you've seen) OR you can specify the GMT offset directly on the Date constructor.

So at the time of creating the date/time using the Date() constructor you need to a) choose what GMT offset to use or b) accept the script's project settings Time Zone.

于 2012-12-18T05:53:41.860 に答える