私は(問題に焦点を当てるために簡略化)のコードを以下ました。すなわち、使用時間帯情報印刷SimpleDateFormat
パターン。
zが異なるマシン上で異なる扱いをされ、なぜあなたは知っていますか?そして、すべてのマシン間で一様に扱うためにJavaを伝える方法があるかどうか?
このクラスは、で使用されているのJavaMail、それが私たちの電子メールヘッダが遵守されていない時含めることの原因となっているRFC 2822を。
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DateFormatTest {
String PATTERN = "z";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.PATTERN);
public static void main(final String[] args) {
new DateFormatTest().printTimezone();
}
public void printTimezone() {
System.out.println(this.simpleDateFormat.format(Calendar.getInstance().getTime()));
}
}
出力:Windowsの/ Mac用
PDT
出力:Linuxの(CentOSのLinuxリリース1804年7月5日(コア))/ Ubuntuの18分の14
GMT-07:00
TL; DR
絶対に使用しないでくださいCalendar
。使用java.timeの代わりにクラスを。
内の文字列のためのRFC 1123 / RFC 822形式:
OffsetDateTime
.now( ZoneOffset.UTC )
.format( DateTimeFormatter.RFC_1123_DATE_TIME )
月、2018年9月24日11時45分21秒〜午後GMT
オフセットから-UTCの特定の時間帯に電流を取得するには:
ZoneId
.systemDefault()
.getRules()
.getOffset(
Instant.now()
)
.toString()
-07:00
避ける Calendar
あなたはで年前に取って代わられた恐ろしい古い日時のクラスを使用しているjava.timeを。これらのレガシークラスを使用しないでください。彼らはひどい惨めな混乱です。
あなたの特定の問題Calendar
行動は議論の余地がある二度とそのクラスを使用する必要がないよう。まだに更新されていない古いコードと相互運用する場合でもjava.time、古いクラスに追加された新しい方法によるレガシー&近代的なクラス間を容易に変換することができます。
ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;
…そして…
GregorianCalendar gc = GregorianCalendar.from( zdt ) ;
java.time
どうやらあなたは、オフセットから-UTCあなたの現在のデフォルトタイムゾーンの現在をしたいです。
、現在のデフォルトのタイムゾーンを取得しますZoneId
。
ZoneId z = ZoneId.systemDefault() ; // Or specify ZoneId.of( "Pacific/Auckland" ) or so on.
尋ねたルールそのタイムゾーンインチ
ZoneRules rules = z.getRules() ;
オフセットから-UTC取得そのゾーンで有効にある瞬間に。私たちは、現在の瞬間を使用しますInstant
。
Instant now = Instant.now() ;
ZoneOffset offset = rules.getOffset( now ) ;
オフセットから-UTCことを表すテキストを生成します。
String output = "At " + now + " in zone " + z + " the offset is " + offset;
38::2018-09-24T23でゾーンアメリカで44.192642Z / Los_Angelesはオフセット-07です:00
RFC 1123 / RFC 822
あなたは、RFCを述べたが、指定されていませんでした。おそらく、RFC 1123/822?
そのためのフォーマッタはに組み込まれていjava.time。
OffsetDateTime nowInUtc = OffsetDateTime.now( ZoneOffset.UTC ) ;
String output = nowInUtc.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;
月、2018年9月24日11時45分21秒〜午後GMT
ISO 8601
FYI、RFC 1123 / RFC 822形式であることをひどいフォーマット。これは、英語を前提としています。人間が読むことのためにマシンを解析するために難しく、かつ困難です。しかし、私はあなたが時代遅れの古いプロトコルのためにそれを必要とするかもしれないことを理解しています。
ただ、現代のプロトコルが使用することを知っているISO 8601標準フォーマットを。便利なことに、これらのフォーマットは、デフォルトで使用されているjava.timeの文字列を生成/解析するときのクラス。
java.time
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
より多くを学ぶために、参照Oracleのチュートリアルを。そして、多くの例および説明のためにスタックオーバーフローを検索します。仕様は、JSR 310。
あなたは交換してもよいjava.timeのデータベースにオブジェクトを直接。使用するJDBCドライバに準拠するJDBC 4.2以降。文字列を使用する必要はありません、が不要java.sql.*
なクラス。
どこjava.timeクラスを取得するには?
- Java SEの8、 Java SEの9、 Java SEの10、 Java SEの11、以降-同梱の実装と標準のJava APIの一部。
- Javaの9は、いくつかのマイナーな機能や修正を追加します。
- Java SEの6と Java SEの7
- java.timeの機能のほとんどはでJava 6&7にバックポートされThreeTen-バックポート。
- アンドロイド
- 実装バンドルのAndroidのそれ以降のバージョンjava.timeのクラス。
- 以前のアンドロイド(<26)の場合、ThreeTenABPのプロジェクトは、適応ThreeTen-バックポート(上記参照します)。参照してください... ThreeTenABPを使用する方法。
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来の追加のための試験場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。