2016-06-13 11 views
0

は私がJavaのSimpleDateFormatの解析ミリフォーマットエラー

import java.text.SimpleDateFormat 

import scala.util.Try 
object TimeParse extends App { 
    val raw = "2016-06-08T10:27:17.369000000000Z" 
    private def parseDate(inputdate: String) = { 
    val fromUser = new SimpleDateFormat("""yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSSSS'Z'""") 
    val myFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss") 
    Try(myFormat.format(fromUser.parse(inputdate))) 
    } 

    val r = parseDate(raw) 
    println("r - " + r) 
} 

しかし出力で、文字列データに"2016-06-08T10:27:17.369000000000Z"を解析する:
r - Success(2016年06月04日 04:27:29)

私はミリ秒のフォーマットを削除した場合、それが正しいだろう、このよう:

object TimeParse extends App { 
    val raw = "2016-06-08T10:27:17Z" 
    private def parseDate(inputdate: String) = { 
    val fromUser = new SimpleDateFormat("""yyyy-MM-dd'T'HH:mm:ss'Z'""") 
    val myFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss") 
    Try(myFormat.format(fromUser.parse(inputdate))) 
    } 

    val r = parseDate(raw) 
    println("r - " + r) 
} 

出力:
r - Success(2016年06月08日 10:27:17) なぜmillisecondに失敗したのでしょうか?

答えて

2

まあ、SimpleDateFormatは10進数で秒とミリ秒の値がありません。

これは別々に処理するため、​​は17秒と369ミリ秒ではなく17秒と369_000_000_000ミリ秒になります。

millisecondsの値はintに切り捨てられ、-367_187_456ミリ秒と解釈され、日付の値(2016-06-08T10:27:17)に追加され、実際の時刻よりも前のタイムスタンプ日付。

も参照してくださいjava.util.Date format SSSSSS: if not microseconds what are the last 3 digits?

+0

私は突然369_000_000_000が-367_187_456に切り捨てできない方法にヒット? – LoranceChen

+0

@LoranceChen SimpleDateFormatはこの数値をlong値として読み込み、それをintにキャストします( '-367187456'を出力する' System.out.println((int)369_000_000_000L); 'のようなものです) –

関連する問題