SimpleDateFormatを使って、順調に日付を解析します。

2577 ワード

解析日付には解析できない異常がしばしば発生します。
java.text.PaseException:Uniparseable date:「Fri,02-Jan-2020 00:00 GMT」
 
解析日付のポイント:
 
1.下表と解析対象文字列を照らし合わせて、対応するpatternを書き出します。
 
文字
日付または時刻要素
表示
GErraフラグ
TextADy
Year199696M年内の月
MonthJulyJul07w年内の周数
Number27W月の中の週数
Number2D年間の日数
Number189d月の日数
Number10F月の中の週
Number2E曜日
TextTuesdayTueaAm/pmタグ
TextPMH一日の時間数(0-23)
Number0k一日の時間数(1-24)
Number24Kam/pmの時間数(0-11)
Number0ham/pmの時間数(1-12)
Number12m時間の中の分
Number30s分の秒数
Number55Sミリ秒
Number978zタイムゾーン
General time zonePacific Standard TimePSTGMT-08:00Zタイムゾーン
RFC 822 time zone-0800 
ここのターゲット文字列は「Fri,02-Jan-2020 00:00 GMT」です。
書き出したpattern=「EEE,dd-MM-yy HH:mm:ss z」
 
2.SimpleDateFormatを使って解析する
String dateStr=「Fri,02-Jan-2020 00:00 GMT」String pattern="EEE,dd-MM-yy HH:mm:ss z"DateFormat format=new SimpleDateFormat;log.info(format.parse); 
 
悲劇はまた起こった。
 
java.text.PaseException:Uniparseable date:「Fri,02-Jan-2020 00:00 GMT」
at java.text.DateFormat.parse(DateFormat.java:337)
 

 
その後実験をしました。このpatternを使って、一つのdateオブジェクトに対してformatを行って結果を調べます。
 
Date d=new Date();DateFormat format=new SimpleDateFormat(「EEE,dd-MM-yy HH:mm:ss z」);log.info(format.format(d)); 
出力結果:火曜日、28-9月-2010 15:12:05 CST
 
はっと悟りました。正しいLocaleを設置しなければならないようです。
アプリを見ると、SimpleDateFormatの中にもう一つの重荷重の構造があるということが分かります。
  SimpleDateFormat(String pattern, Locale locale)           与えられたモードと所定の言語環境の標準日付書式記号で構成されています。  SimpleDateFormat 
前のコードを改良すれば、スムーズに解析できます。
 
String dateStr=「Fri,02-Jan-2020 00:00 GMT」String pattern="EEE,dd-MM-yy HH:mm:ss z"DateFormat format=new SimpleDateFormat(pattern,Locale.US)log.info(format.parse);log.info(format) 
 
出力結果:Thu Jan 02 08:00 CST 2020
 
このように類推して、他のフォーマットもこのように解析できます。鍵はpatternが必ず正しいということです。また、正しいLocaleを設定します。