jsonでデータを送信する必要があります。重要なのは、受信者が現地時間で日付を取得できるように、ロケールを保持したいということです。どうやってやるの?
Date.toString()
を単純に使用することはできません。それは、ロケールが異なる場合(曜日や月の名前などが異なる場合)、受信側で日付を解析することができないためです。
これに対する解決策はありますか?
タイムスタンプにはJava.util.DateのgetTimeメソッドを使用します。日付に変換すると、すべての受信者がローカルタイムゾーンを使用して日付を表示できます。
その日付を覚えて
ミリ秒の精度で特定の瞬間を表します。
ToStringメソッドは 特定の方法 でフォーマットするだけです:
dow mon dd hh:mm:ss zzz yyyy
タイムスタンプの送信を選択すると、使用する帯域幅も少なくなります。
1970年からのmsの長い時間は問題ありませんが、人間が読めるわけではないため、テスト/開発用のPITAです。
したがって、ISO 8601 標準の日付時刻"yyyy-MM-dd'T'HH:mm:ss"
を使用します('T'
は単なるリテラルT
(多くの場合、ここにスペースが表示されます。秒の小数部.SSS
)。
時間ゾーンも可能ですが、必要ない場合もあります(=ローカライズされた時間に組み込まれます)。
Java 8の前はSimpleDateFormat
を使用。
Instant.now()
.toString()
2017-01-23T12:34:56.123456789Z
一般的に、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 標準は、日時値のテキスト表現のための明確で読みやすく、解析しやすいフォーマットを定義しています。これらのフォーマットは、データ交換に最適です。
しばらくの間、UTCでは、上記の例に見られる形式を意味します。 T
は、日付部分と時刻部分を分離します。末尾のZ
はZulu
の略で、UTCを意味します。
質問では、タイムゾーンに関連するかのようにロケールについて言及しています。 Locale
は、タイムゾーンに関係なく何もしません。 Locale
は、(a)日の名前、月の名前などを翻訳するための人間の言語、および(b)省略形、大文字、句読点などの問題を決定する文化的規範を指定します。
タイムゾーンは、地域の オフセットからのオフセット への変更の履歴であり、 夏時間(DST) などの変更を引き起こす異常を追跡します。
詳細については、Stack Overflowを検索してください。これはすでに何百回もカバーされています。 ZoneId
、ZoneOffset
、ZonedDateTime
、Instant
、OffsetDateTime
、DateTimeFormatter
などのクラスを検索します。 Java.timeクラスの Oracleチュートリアル をお読みください。
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古い レガシーに取って代わりますJava.util.Date
、 Calendar
、& SimpleDateFormat
などの日時クラス.
Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用します。文字列も、Java.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがここにあります。
これを行う適切な方法は、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を使用しています。
これを行う簡単な方法があると思います
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date()));
それには多くの方法があります。ロケールに依存しないミリ秒単位で日付を変換し、それをさらに使用する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」になります。