web-dev-qa-db-ja.com

JsonでJava.util.Dateを送信する方法は?

jsonでデータを送信する必要があります。重要なのは、受信者が現地時間で日付を取得できるように、ロケールを保持したいということです。どうやってやるの?

Date.toString()を単純に使用することはできません。それは、ロケールが異なる場合(曜日や月の名前などが異なる場合)、受信側で日付を解析することができないためです。

これに対する解決策はありますか?

8
Greyshack

タイムスタンプにはJava.util.DateのgetTimeメソッドを使用します。日付に変換すると、すべての受信者がローカルタイムゾーンを使用して日付を表示できます。

その日付を覚えて

ミリ秒の精度で特定の瞬間を表します。

ToStringメソッドは 特定の方法 でフォーマットするだけです:

dow mon dd hh:mm:ss zzz yyyy

タイムスタンプの送信を選択すると、使用する帯域幅も少なくなります。

3
Laurentiu L.

1970年からのmsの長い時間は問題ありませんが、人間が読めるわけではないため、テスト/開発用のPITAです。

したがって、ISO 8601 標準の日付時刻"yyyy-MM-dd'T'HH:mm:ss"を使用します('T'は単なるリテラルT(多くの場合、ここにスペースが表示されます。秒の小数部.SSS)。

時間ゾーンも可能ですが、必要ない場合もあります(=ローカライズされた時間に組み込まれます)。

Java 8の前はSimpleDateFormatを使用。

6
Joop Eggen

tl; dr

Instant.now()
       .toString()

2017-01-23T12:34:56.123456789Z

UTC

一般的に、UTC(GMT)の日時値のデータを交換するのが最適です。レシーバーを目的のタイムゾーンに調整します。

Instant

Instantクラスは、ナノ秒の分解能でUTCのタイムライン上の瞬間を表します。

Instant instant = Instant.now() ;
String output = instant.toString() ;  // Generate a String in standard ISO 8601 format.

2017-01-23T12:34:56.123456789Z

その文字列は簡単に解析できます。

Instant instant = Instant.parse( "2017-01-23T12:34:56.123456789Z" ) ; 

ISO 8601

ISO 8601 標準は、日時値のテキスト表現のための明確で読みやすく、解析しやすいフォーマットを定義しています。これらのフォーマットは、データ交換に最適です。

しばらくの間、UTCでは、上記の例に見られる形式を意味します。 Tは、日付部分と時刻部分を分離します。末尾のZZuluの略で、UTCを意味します。

ロケール

質問では、タイムゾーンに関連するかのようにロケールについて言及しています。 Locale は、タイムゾーンに関係なく何もしませんLocaleは、(a)日の名前、月の名前などを翻訳するための人間の言語、および(b)省略形、大文字、句読点などの問題を決定する文化的規範を指定します。

タイムゾーンは、地域の オフセットからのオフセット への変更の履歴であり、 夏時間(DST) などの変更を引き起こす異常を追跡します。

詳細については、Stack Overflowを検索してください。これはすでに何百回もカバーされています。 ZoneIdZoneOffsetZonedDateTimeInstantOffsetDateTimeDateTimeFormatterなどのクラスを検索します。 Java.timeクラスの Oracleチュートリアル をお読みください。

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古い レガシーに取って代わりますJava.util.DateCalendar 、& SimpleDateFormat などの日時クラス.

Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用します。文字列も、Java.sql.*クラスも必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 IntervalYearWeekYearQuartermore などの便利なクラスがここにあります。

4
Basil Bourque

これを行う適切な方法は、ISO 8601形式で日付を書き込むことです。つまり、2015-08-03T4:50:49+00:00

タイムゾーンが含まれるだけでなく、JSONの受信側にある標準のデコーダーでも問題なくデコードできます。

送信部分については、文字列を自分で書き込む場合は、フォーマットするだけです。

ZonedDateTime.now( ZoneId.systemDefault() )
             .format( DateTimeFormatter.ISO_DATE_TIME )

ただし、JSONシリアライザを使用してJavaオブジェクト(たとえば、Jacksonなど))から変換する場合は、オブジェクト属性をJava.util.Dateおよびシリアライザは、適切な設定を前提として、何をすべきかを知っている必要があります。ジャクソンについては this answer を、ジャージーについては this one を参照してください。どちらもJoda Timeを使用しています。

2
mprivat

これを行う簡単な方法があると思います

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date()));
1
SwapnilKumbhar

それには多くの方法があります。ロケールに依存しないミリ秒単位で日付を変換し、それをさらに使用する1つの方法。 utc形式で日付を変更してさらに使用する別の方法。サーバーのタイムゾーンがUTCに設定されている場合Java.util.Dateは、新しいDate( "some date")を使用するときにデフォルトでシステムのタイムゾーンを使用するため、完全に機能します。例:

   long lastAccessedDate =  110002028250;
  String myDate = new Java.util.Date(lastAccessedDate()).toString();

システムのタイムゾーンがUTCの場合、myDateは「Tue Jun 06 05:30:00 UTC 2017」になります。

0