2017-01-25 80 views
0

我遇到的是相當奇特的。格式yyyy-MM-dd HH:mm:ss從字符串到日期格式

我的代碼:

val aa = "2017-01-17 01:33:00" 
    val bb = "04:33" 
    val hour = bb.substring(0, bb.indexOf(":")) 
    val mins = bb.substring(bb.indexOf(":") + 1, bb.length()) 
    val negatedmins = "-" + mins 
    val ecoffsethour = hour.toLong 
    val ecoffsetmins = negatedmins.toLong 
    println(aa) 
    val datetimeformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") 
    val txn_post_date_hkt_date_parsed = LocalDateTime.parse(aa, datetimeformatter) 
    println(txn_post_date_hkt_date_parsed) 
    val minushours = txn_post_date_hkt_date_parsed.minusHours(ecoffsethour) 
    println(minushours) 
    val minusmins = minushours.minusMinutes(ecoffsetmins) 
    println(minusmins) 
    val offsetPostdateDiff = minusmins.toString().replace("T", " ") 
    println(offsetPostdateDiff) 

輸出:

2017-01-17 01:33:00 
2017-01-17T01:33 
2017-01-16T21:33 
2017-01-16T22:06 
2017-01-16 22:06 

在相同的代碼,我改變只有 「AA」 的價值==>2017-01-17 01:33:44

現在輸出的是:

2017-01-17 01:33:44 
2017-01-17T01:33:44 
2017-01-16T21:33:44 
2017-01-16T22:06:44 
2017-01-16 22:06:44 

爲什麼第一種方法不考慮秒場?

我的要求是:然而輸出應進來 「YYYY-MM-DD HH:MM:SS」 的格式。

我對斯卡拉很陌生。請賜教。

+1

您只使用格式化解析不打印日期。另一個問題是,你正在做一些已經提供的算術運算。 – pedrofurla

+0

@pedrofurla:該arthimetics按照我的要求。希望與這個問題無關。 –

回答

0

通常更好的是明確你想要輸出的格式。

所以,與其

println datetime 

你可以做這樣的事情:

println datetimeformat.print(datetime) 

祝你好運!

編輯:改變由使2所表達完全等同

+0

其實'println(datetimeformat.print(datetime))' – pedrofurla

+0

謝謝@pedrofurla。 –

1

默認格式是ISO 8601

的java.time類解析/生成字符串來表示日期時間時默認使用標準ISO 8601格式值。

本地日期時間的標準格式是您在中間看到的TYYYY-MM-DDTHH:MM:SS.SSSSSSSSS

LocalDateTime ldt = LocalDateTime.now(ZoneId.of("America/Montreal")) ; 
String output = ldt.toString() ; 

2017-01-23T12:34:56.789

您的通話println(txn_post_date_hkt_date_parsed)被隱式調用內置LocalDateTime對象toString方法,從而要求標準ISO 8601格式與T

println(txn_post_date_hkt_date_parsed.toString()) 

偏移

在一個不相關的音符,你的工作太辛苦了。 java.time類處理偏移量。我不明白你爲什麼要抵消這樣一個奇數(四小時三十三分鐘),但這樣做。

這裏是您的代碼修改,但在Java語法。

String input = "2017-01-17 01:33:00" ; 

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ; 
LocalDateTime ldt = LocalDateTime.parse(input , f) ; 
OffsetDateTime utc = ldt.atOffset(ZoneOffset.UTC) ; 

ZoneOffset offset = ZoneOffset.of("-04:33") ; // Behind UTC by four hours and thirty-three minutes. 
OffsetDateTime odt = utc.withOffsetSameInstant(offset) ; 

你可以看到這個code run live at IdeOne.com。請注意您的offset-from-UTCwall-clock time是如何在前一天。歷史上的同一時刻,時間線上的相同點,但通過兩個不同的掛鐘時間(UTC,以及4小時零三十分鐘後)查看。

Z最後是標準的ISO 8601表示法,簡寫爲Zulu,意思是UTC。

輸入:2017年1月17日1點33分○○秒

ldt.toString():2017-01-17T01:33

utc.toString():2017-01-17T01 :33Z

odt.toString():2017-01-16T21:00-04:33