Singhによる正しい回答が言うように、Date
実際にはUTCですが、そのtoString
方法は文字列の生成中に現在のデフォルトのタイムゾーンを紛らわしく適用します。
ISO8601
10/16/2012 12:06 PM
日時値などの形式は避けてください。テキストにシリアル化するときは、まさにこの目的のために標準として定義されているISO 8601形式を使用します。
java.time
これが簡単な質問のように思われる場合は申し訳ありません.Javaの日付に多くの問題があります.
それはあなたではありません。それはクラスです。古いレガシーの日時クラスは、日時の処理において業界をリードする勇敢な取り組みでした。しかし、それらは考えが浅く、設計が不十分で、非常に混乱し、面倒であることが判明しました。現在は java.time クラスに取って代わられています –大幅な改善です。
この厄介な古いjava.util.Date
クラスは完全に避けてください。代わりに使用Instant
してください。
Instant
このクラスは、 UTCInstant
のタイムライン上の瞬間をナノ秒単位(小数点以下 9 桁まで) で表します。
現在の瞬間を取得します。
Instant instant = Instant.now();
古い日時クラスに追加された新しい変換メソッドの 1 つを呼び出すことにより、Date を最新の置換に変換できます。toInstant を呼び出すだけで、非常に簡単です。
Instant instant = myJavaUtilDate.toInstant();
java.time クラスは、文字列の生成時にデフォルトで ISO 8601 形式を使用します。toString
オブジェクト内の値の明確な表現を取得するために呼び出すだけです。
String output = instant.toString();
2016-12-23T01:33:09.731Z
解析中
入力文字列を解析するには、一致するフォーマット パターンを定義します。パターン コードは のコードと似ていますがSimpleDateFormat
、まったく同じではありません。そのため、必ずドキュメントを注意深く調べてください。
String input = "10/16/2012 12:06 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu hh:mm a" );
入力には、UTC からのオフセットまたはタイム ゾーンに関する手がかりがありません。したがって、 として解析する必要がありLocalDateTime
ます。オフセットやゾーンがないため、aLocalDateTime
は可能な瞬間についての漠然とした考えにすぎず、タイムライン上のポイントを表していません。
LocalDateTime ldt = LocalDateTime.parse( input , f );
ldt.toString(): 2012-10-16T12:06
質問は、これが「ESTタイムゾーン」を意味していると主張しています. したがってZoneId
、LocalDateTime
を取得するには、タイムゾーン a を適用する必要がありますZonedDateTime
。
、、、などの適切なタイム ゾーン名を の形式で指定します。またはなどの 3 ~ 4 文字の略語は絶対に使用しないでください。これらは、実際のタイム ゾーンではなく、標準化されておらず、一意でもありません (!)。continent/region
America/Montreal
Africa/Casablanca
Pacific/Auckland
EST
IST
おそらくEST
、米国とカナダの東海岸の多くで使用されているタイム ゾーンを意味していたのでしょう。勝手に選びますAmerica/New_York
。
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString(): 2012-10-16T12:06-04:00[アメリカ/ニューヨーク]
UTC に到達するには、単純にInstant
. これを概念的に次のように考えることができます。
ZonedDateTime = (インスタント + ZoneId)
Instant instant = zdt.toInstant();
インスタント.toString(): 2012-10-16T16:06:00Z