Google Directions APIを使用してトランジット ナビゲーション アプリを開発しています。
API ではdeparture_time
、交通機関のクエリに対して出発時刻 ( ) を送信する必要があります。
このパラメーターの現地時間を UTC 時間に変換する必要がありますか?
正確な時刻が返されないため、API の応答で検証できませんでした。
Google Directions APIを使用してトランジット ナビゲーション アプリを開発しています。
API ではdeparture_time
、交通機関のクエリに対して出発時刻 ( ) を送信する必要があります。
このパラメーターの現地時間を UTC 時間に変換する必要がありますか?
正確な時刻が返されないため、API の応答で検証できませんでした。
どうやら、そのドキュメント ページを書いている Google チームがエラーを起こし、後で修正したようです。
ご報告いただいた番号1343605500
は、そのページにはありません。今日、そのページの番号は です1343641500
。以前にそのページでその番号を見たことがあると思います。グーグルで(皮肉なことに)site:https://developers.google.com 1343605500
そのページをヒットとしてリストします。どうやら、ヒットは古いエラー ページのキャッシュ コピーに基づいているようです。グーグルでさえ、グーグルの手から逃れることはできません。
このパラメーターの現地時間を UTC 時間に変換する必要がありますか?
はい。
API は GMT/UTC (タイム ゾーン オフセットなし) で動作しますが、これは考えてみないと意味がありません。ほとんどの場合、日時を処理するためのベスト プラクティスは、ビジネス ロジック、シリアル化、データベース レコードなどをUTCで実行し、ユーザーに表示するためだけに現地時間に変換することです。
URL 自体の例を見るだけで、それが UTC であることがわかります。ローカル タイム ゾーンへの唯一の可能な参照は、タイム ゾーンの明確な一意の識別子ではない「ブルックリン」という単語です。
そしてもちろん、ドキュメントには 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