2013-05-20 9 views
12

最近、運用環境で奇妙なエラーが発生しました(テスト環境はうまく動作します)。java dateformat不正なパターン文字 'y'

java.lang.IllegalArgumentExceptionが:無効なパターン文字「Y」

これは、例えば代わり​​にY」の「Y」を使用する場合、このエラーは、通常、スローされ、次のコード

SimpleDateFormat dateFormat = (SimpleDateFormat)DateFormat.getDateInstance(); 
dateFormat.applyLocalizedPattern("yyyy-MM-dd"); 

によって引き起こされます' 年間。上記のように、ここには該当しません。私は、サーバー上に設定されているロケールを100%確信しているわけではありません。 Linuxのenv LANGは "de_DE.UTF_8"に設定されているので、おそらくこれが使用されています。

SimpleDateFormat.javaのソースコードを入力すると、translatePattern(String pattern, String from, String to)というメソッドが見つかりました。これは、patternのいずれかの文字がから存在しないときに言及された例外をスローします。別のコンピュータ上でローカル=「GyMdkHmsSEDFwWahKzZ」サーバー上の例外から

から=「YYYY-MM-DD」

パターンをデバッグするときの値が、それは明らかである。このようになります。その第一は「y 'はfromに存在しません。 fromformatData.getLocalPatternChars()からフェッチされます。DateFormatSymbolsはサーバーのロケールから初期化されています。

「y」のないフォーマットを使用できるロケールもありますか?このエラーは、コード変更なしで発生し始めました。私の知るところでは、サーバー設定の変更はありません。 SimpleDateFormatのJavadocのから

+0

実行中の正確なJVMとは何ですか? –

+0

java.vm.specification.vendor:Sun Microsystems Inc. java.runtime.version:1.6.0_37-b06 –

+0

これはtestで実行しているものと同じですか? –

答えて

11

てSimpleDateFormatはまた、ローカライズされた日付と時刻のパターン 文字列をサポートしています。これらの文字列では、上記のパターン文字は で、ロケールに依存するパターン文字に置き換えられます。

あなたの場合、ローカルはDEなので、ローカライズされたパターンはjjjj-MM-ttになります。 JはJahr、TはTageを表します。

ローカライズされたパターンを処理したくない場合は、SimpleDateFormat.applyPattern("yyyy-MM-dd")を使用してください。

+0

ありがとう、私はちょうどエラーを見つけたと思います...サーバロケールをドイツ語に変更しますが、initサーブレットでswedishに変更します。私は生産が昨日再開されたときに初期化が崩壊したと思うし、ドイツのロケールで立ち往生した! –

+0

http://stackoverflow.com/a/10731242/2105986が問題になることがあります。 – faizal

7

理想的にはパターンのロケールを適用する必要があります。それ以外の場合は、yyyyがen_US、jjjjがde_DEなどと異なるロケールでパターンを変更する必要があります。代わりに、マシンのロケールに関係なくyyyyとlocaleをen_USとして指定します。

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); 
System.out.println(format.format(new java.util.Date())); 

Javadocが言うように:

は、指定されたパターンと指定されたロケールのデフォルト 日付フォーマット記号を使ってSimpleDateFormatを構築します。注:このコンストラクタは、すべてのロケールをサポートしていない です。完全なカバレッジを得るには、 のファクトリメソッドをDateFormatクラスで使用してください。

パラメータ:

パターン:日付と時刻のフォーマットを記述するパターン

ロケール:その日付フォーマット記号を

この方法を使用する必要があり、あなたが持っていないロケール実行時ロケールで選択するローカル文字列と特定ロケールを一度実行することを心配する必要があります。

+0

はい、私が言及したコードは2007年であり、私によってコード化されていないことに同意します。私たちはサーバー上でロケールを強制しますが、locale.setDefault(new Locale( "sv"、 "SE"))が呼び出される前に初期化がクラッシュし、サーバーのデフォルトのドイツ語が使用されてしまいます。 –

+0

上記のコードを維持することであり、初期化エラーを致命的にして、アプリケーションが実行を拒否したい場合があります。 –

関連する問題