2017-09-19 1 views
1

で私はmillisecondsにこれを変換すると、この2016-11-25T09:29:10.588+01:00フォーマットISO 8601のJava 7

のような日付形式を持って後、私は再びミリ秒に「yyyy-MM-dd HH:mm:ss.SSS」このフォーマットを変換する必要があります印刷中。

static FastDateFormat alarmDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS"); 
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX"); 
df1.setTimeZone(TimeZone.getTimeZone("UTC")); 
String string1 = "2016-11-25T09:29:10.588+01:00"; 
Date result1 = df1.parse(string1); 
long timeStamp = result1.getTime(); 
System.out.println("timeStamp : " +timeStamp); 
String eventTime = alarmDateFormat.format(timeStamp); 
System.out.println("AfterConverting : " + eventTime); 

結果:

timeStamp : 1480062550588 
AfterConverting : 2016-11-25 13:59:10.588 

Dateが適切であるが、時間が異なっています。私は "UTC"にタイムゾーンを設定しようとしましたが、それは助けになりませんでした。

ご注意:Javaの8で、それはインスタントとすべてのような他のライブラリと正常に動作しますが、我々はあなたがdf1setTimeZoneを呼んでいるが、このフォーマッタが唯一の解析に使用され、そしてそれのJava 7に

+1

"私はタイムゾーンを" UTC "に設定しようとしましたが、それは助けになりませんでした - うまくいけば...あなたは' FastDateFormat'のタイムゾーンを設定すると、あれは。どのようにタイムゾーンを設定しようとしたかを示してください。 –

+0

df1.setTimeZone(TimeZone.getTimeZone( "UTC")); –

+1

@HarshaG新しい情報で常に質問を更新してください。 – timiTao

答えて

3

を望んでいました書式設定には何の効果もありません。

日付を特定のタイムゾーンにフォーマットするには、別のフォーマッタで日付を設定する必要があります(設定しない場合、フォーマッタはJVMのデフォルトタイムゾーンを使用します)。また、FastDateFormatのような別のクラスに頼る必要はなく、別のSimpleDateFormatを使うこともできます。

しかし、正確に同じ日付/時刻を取得するには、入力に使用されているのと同じオフセット(+01:00)を使用する必要があります。 Dateオブジェクトdon't keep this informationですので、入力から抽出する必要があります。一つの方法は、substringを使用することです:

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX"); 
String string1 = "2016-11-25T09:29:10.588+01:00"; 
Date result1 = df1.parse(string1); 
long timeStamp = result1.getTime(); 
System.out.println("timeStamp : " + timeStamp); 

// extract the +01:00 offset from the input 
String offset = string1.substring(23); 
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
// set the offset in the formatter (so output is converted to it) 
df2.setTimeZone(TimeZone.getTimeZone("GMT" + offset)); 
String eventTime = df2.format(timeStamp); 
System.out.println("AfterConverting : " + eventTime); 

出力は次のようになります。

タイムスタンプ:1480062550588
AfterConverting:2016年11月25日09:29:10.588

場合FastDateFormatを引き続き使用したい場合は、その中にタイムゾーンを設定することもできます。

FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset)); 
String eventTime = f.format(timeStamp); 

Javaの新しい日付/時刻のAPI

古いクラス(DateCalendarSimpleDateFormatは)lots of problemsdesign issuesを持っている、と彼らは新しいAPIに置き換えられています。

Java 7の場合、ThreeTen Backportは、Java 8の新しい日付/時刻クラス用の優れたバックポートです。 Androidの場合は、ThreeTenABP(詳細はhereの使い方)が必要です。

これを使用すると、入力をorg.threeten.bp.OffsetDateTimeに解析し、出力にorg.threeten.bp.format.DateTimeFormatterを使用できます。この場合、あなたはフォーマッタでそれを設定する必要はありませんので、OffsetDateTimeは、オフセット情報を保持します:

OffsetDateTime odt = OffsetDateTime.parse(string1); 
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
System.out.println("timeStamp : " + odt.toInstant().toEpochMilli()); 
System.out.println("AfterConverting : " + odt.format(fmt)); 

出力は同じです。

タイムスタンプ:1480062550588
AfterConverting: 2016-11-25 09:29:10.588

関連する問題