異なるOS上の異なったJavaのSimpleDateFormat解釈「Z」

Abhijeet Apsunde:

私は(問題に焦点を当てるために簡略化)のコードを以下ました。すなわち、使用時間帯情報印刷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.DateCalendar、& SimpleDateFormat

ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。

より多くを学ぶために、参照Oracleのチュートリアルをそして、多くの例および説明のためにスタックオーバーフローを検索します。仕様は、JSR 310

あなたは交換してもよいjava.timeのデータベースにオブジェクトを直接。使用するJDBCドライバに準拠するJDBC 4.2以降。文字列を使用する必要はありません、が不要java.sql.*なクラス。

どこjava.timeクラスを取得するには?

ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来の追加のための試験場です。あなたはここにいくつかの有用なクラスのような見つけることがIntervalYearWeekYearQuarter、および多くを

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=168641&siteId=1