3

Google Directions APIを使用してトランジット ナビゲーション アプリを開発しています。

API ではdeparture_time、交通機関のクエリに対して出発時刻 ( ) を送信する必要があります。

このパラメーターの現地時間を UTC 時間に変換する必要がありますか?

正確な時刻が返されないため、API の応答で検証できませんでした。

4

1 に答える 1

1

そのドキュメントはエラーでした

どうやら、そのドキュメント ページを書いている Google チームがエラーを起こし、後で修正したようです。

ご報告いただいた番号1343605500は、そのページにはありません。今日、そのページの番号は です1343641500。以前にそのページでその番号を見たことがあると思います。グーグルで(皮肉なことに)site:https://developers.google.com 1343605500そのページをヒットとしてリストします。どうやら、ヒットは古いエラー ページのキャッシュ コピーに基づいているようです。グーグルでさえ、グーグルの手から逃れることはできません。

UTC/GMT で作業する

このパラメーターの現地時間を UTC 時間に変換する必要がありますか?

はい。

API は GMT/UTC (タイム ゾーン オフセットなし) で動作しますが、これは考えてみないと意味がありません。ほとんどの場合、日時を処理するためのベスト プラクティスは、ビジネス ロジック、シリアル化、データベース レコードなどをUTCで実行し、ユーザーに表示するためだけに現地時間に変換することです。

URL 自体の例を見るだけで、それが UTC であることがわかります。ローカル タイム ゾーンへの唯一の可能な参照は、タイム ゾーンの明確な一意の識別子ではない「ブルックリン」という単語です。

http://maps.googleapis.com/maps/api/directions/json?origin=Brooklyn&destination=Queens&sensor=false&departure_time=1343641500&mode=transit

そしてもちろん、ドキュメントには API が UTC/GMT を使用すると書かれています。

1970 年 1 月 1 日 UTC の午前 0 時からの希望出発時刻 (秒数)

下手な書き方

この混乱は、そのドキュメント ページの記述が不十分であることが原因です。その「午前 9 時 45 分」に重要な「UTC」または「GMT」を追加する必要があります。ニューヨークと 9 時 45 分を同時に言及することは現地時間を意味しますが、その例は実際にはブルックリンの現地時間の朝 5 時 45 分です。

以下のリクエストは、ニューヨーク州ブルックリンからニューヨーク州クイーンズまでの乗換案内を検索します。乗換案内をリクエストするときは、departure_time またはarrival_time のいずれかを必ず指定してください。

この例では、出発時刻が 2012 年 7 月 30 日午前 9 時 45 分と指定されていることに注意してください。リクエストを送信する前に、パラメータを将来の時点に更新してください。

古い数字と新しい数字

古い番号: 1343605500 ( davidg およびグーグルによる回答で報告)

新しい番号: 1343641500 (2013 年 12 月に発見)

ニューヨークの 9 時 45 分を意味していた場合の数字は 1343655900 です。

サンプルコード

私はJavaScriptをしません。その代わりに、Java 7 で実行される洗練されたJoda-Time 2.3 日時処理ライブラリーを使用した Java コードを示します。古い (誤った) 数値と新しい (正しい) 数値の両方を使用して、UTC と New の両方で日時を表示します。ヨークのタイムゾーン。さらに、ニューヨークで 2012 年 7 月 30 日の午前 9 時 45 分に到達するためにエポックが使用されてからの秒数を計算し、3 番目の秒数を生成します。

Google API は秒を使用しますが、Joda-Time はミリ秒を使用するため、1000 で乗算または除算します。

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;

DateTimeZone timeZone_NewYork = DateTimeZone.forID( "America/New_York" );

// On this page:
// https://developers.google.com/maps/documentation/directions/#ExampleRequests
// …look for the following two paragraphs…
// --
// The below request searches for Transit Directions from Brooklyn, New York to Queens, New York. When requesting transit directions, be sure to specify either a departure_time or arrival_time.
// Note that in this example the departure time is specified as July 30, 2012 at 09:45 am. Update the parameter to a point in the future before submitting the request.
// --
// Below that text, find this URL:
// http://maps.googleapis.com/maps/api/directions/json?origin=Brooklyn&destination=Queens&sensor=false&departure_time=1343641500&mode=transit
// Extract that departure time of 1,343,641,500 seconds since the Unix Epoch of beginning of 1970 UTC.
// Apparently in the past that page erroneously used the number 1343605500 where today it uses 1343641500.

// Use the correct number found on that page today, 2013-12-25: 1343641500.
DateTime dateTimeInUtcWithNewNumber = new DateTime ( ( 1343641500L * 1000L ), DateTimeZone.UTC );
DateTime dateTimeInNewYorkWithNewNumber = dateTimeInUtcWithNewNumber.toDateTime( timeZone_NewYork );
System.out.println( "dateTimeInUtcWithNewNumber: " + dateTimeInUtcWithNewNumber );
System.out.println( "dateTimeInNewYorkWithNewNumber: " + dateTimeInNewYorkWithNewNumber );

// Use the old erroneous number previously found on that page: 1343605500.
DateTime dateTimeInUtcWithOldNumber = new DateTime ( ( 1343605500L * 1000L ), DateTimeZone.UTC );
DateTime dateTimeInNewYorkWithOldNumber = dateTimeInUtcWithOldNumber.toDateTime( timeZone_NewYork );
System.out.println( "dateTimeInUtcWithOldNumber: " + dateTimeInUtcWithOldNumber );
System.out.println( "dateTimeInNewYorkWithOldNumber: " + dateTimeInNewYorkWithOldNumber );

// Calculating the number that should have been used if the Google team had actually meant 9:45 AM local time in New York: 1343655900.
DateTime dateTimeInNewYork_2012_07_30_09_45 = new DateTime ( 2012, 7, 30, 9, 45, 0, timeZone_NewYork );
System.out.println( "dateTimeInNewYork_2012_07_30_09_45: " + dateTimeInNewYork_2012_07_30_09_45 );
System.out.println( "dateTimeInNewYork_2012_07_30_09_45 in seconds since Unix epoch: " + ( dateTimeInNewYork_2012_07_30_09_45.getMillis() / 1000L ) );

実行すると…</p>

dateTimeInUtcWithNewNumber: 2012-07-30T09:45:00.000Z
dateTimeInNewYorkWithNewNumber: 2012-07-30T05:45:00.000-04:00
dateTimeInUtcWithOldNumber: 2012-07-29T23:45:00.000Z
dateTimeInNewYorkWithOldNumber: 2012-07-29T19:45:00.000-04:00
dateTimeInNewYork_2012_07_30_09_45: 2012-07-30T09:45:00.000-04:00
dateTimeInNewYork_2012_07_30_09_45 in seconds since Unix epoch: 1343655900
于 2013-12-25T19:34:24.707 に答える