2016-09-11 4 views
1

私たちは、バックエンドからデータを取得するためのパラメータとして日付と時刻を取るリソースベースのサービスを提供しています。Java 8でリクエスト日時をUTC形式に変換するリクエストからzoneIDを取得

データはUTC形式でデータベースに格納され、サーバーはUTCタイムゾーンも設定されます。

クライアントからリクエストを受け取ったときに、日付と時刻をUTC形式の日付と時刻に変換し、それに応じてデータベースにクエリします。

変換を行うために、私は与えられたzoneIdからUTCフォーマットに変換する以下のコードを持っています。

public ZonedDateTime convertDateBetweenTimeZones(LocalDateTime sourceDateTime,String sourceZone,String targetZone){ 
    return sourceDateTime.atZone(ZoneId.of(sourceZone)).withZoneSameInstant(ZoneId.of(targetZone)); 
    } 

私は私はそれをデータベースに渡し、それに応じて照会することができると思うzonedDateTimeオブジェクトを取得できたら、私は

ZonedDateTime zonedDateTime=convertDateBetweenTimeZones(LocalDateTime.now(),"Asia/Calcutta","UTC"); 

、以下のように上記のメソッドを呼び出します。

私の質問では、ソースタイムゾーンのzoneIDとして "Asia/Calcutta"を渡しました。しかし、ソースタイムゾーンには、「America/New_York」または「Asia/Singapore」のいずれかにすることができます。

この場合、クライアントから受け取った要求からどのようにzoneIdを動的に取得して、それに従って適切に変換できるかわかりません。

私のシナリオを処理するためのzoneIdまたは別の方法は、どのように入手できますか?

おかげで、

JavaUser

答えて

0

一つの解決策は、あなたが非標準のタイムゾーンのIDを保持し、ZoneId.of(id, alias)メソッドに渡すために別名マップを使用することができます。例:

HashMap<String, String> aliasMap = new HashMap<>(); 
aliasMap.put("FOO", "America/New_York"); 
ZoneId zoneId = ZoneId.of("FOO", aliasMap); 
1

あなたはすべてうまくやっていますが、3つのことがあります。

は、サーバーのタイムゾーンが

サーバーのタイムゾーンの設定は、あなたのコーディングとは無関係であるべき設定を無視します。サーバーの設定はいつでも変更することができますので、それに頼ることはできません。

必要なタイムゾーンを指定するには、オプションのタイムゾーンオブジェクトを関連するすべてのjava.timeメソッドに常に渡します。

proper IANA 'tz' time zone namescontinent/regionフォーマットでは、America/Montrealのように賢明に使用しています。 ESTまたはISTなどの3文字の略語は、標準時ではなく、一意ではない(!)ため、決して使用しないでください。

データベース

データベース交換のために、あなたはおそらくtoInstantメソッドを介してZonedDateTimeからInstantを抽出する必要があります。大部分の深刻なデータベースは、日時をUTCで格納します。 Instantクラスは、ナノ秒の分解能でタイムライン上でUTCの瞬間を表します。

JDBCに準拠したJDBCドライバ4。2以降はResultSet::getObjectPrepatedStatement::setObjectで直接Instantを使用する可能性があります。そうでない場合は、簡潔にjava.sql.Timestampなどのjava.sqlタイプに変換することに戻ります。

データベースの動作を日時処理で慎重に検討します。さまざまなデータベースが)に広がっています。 SQL仕様では、数日のタイプを漠然としていない過去の日時処理のトピックについてはほとんど言及していません。 Postgresのようなものは、優れた日時サポートを持っているものもあれば、サポートが貧弱なものもあれば、動作が異なるものもあります。単純ではないWebブラウザからタイムゾーンを決定するためとして

ブラウザのタイムゾーン

Search Stack Overflow多くの質問と回答が掲載されています。

最終的には、という唯一の方法は、ユーザーにと尋ねることです。ユーザーからデータを収集するときにタイムゾーンフィールドを含めます。

関連する問題