2016-11-29 47 views
1

使用Jdk8。 我試圖將實際上只有幾小時的時間(如1130)轉換爲DateTime。我正在嘗試2種方式,因爲它們都不能正常工作。 1130被轉換爲11:00並且另一個3:00沒有一個是正確的。還有第三種方式命名我的時區。Java TimeZoneOffset時間轉換

Long ltime = Long.parseLong("1130"); 
    Long seconds = (ltime/100)*60*60; 
    LocalDateTime tsutcDttime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC); 
    LocalDateTime lclDttime = LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), ZoneId.systemDefault()); 
System.out.println("ZoneId.systemDefault: " +ZoneId.systemDefault()); 
System.out.println("UTC LocalDateTime : "+ tsutcDttime); 
System.out.println("Sys Def LocalDateTime : "+ lclDttime); 

ZoneId.systemDefault:美洲/洛杉磯

UTC LocalDateTime:1970-01-01T 11:00

Sys系統默認值LocalDateTime:1970-01-01T 03:00

此問題通過以下解決。

這個問題 對於我的一些時間的成分的第2部分我有一個日期和其他一些我不知道(但我要的一切轉換成日期時間反正。

如何添加實際??年月日時我有我沒有看到一個方法LOCALDATE的(日期)對於其他人就乾脆讓默認到1970年,除非更好的SOLN存在 下面只是把1970年日期:

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(secondsOfDay, 0, ZoneOffset.UTC); 

但是,當我有一個日期,我想將它添加到secondsOfDay和Cre吃了我的日期時間 - 如何。如日期= 2016年1月1日+ secondsOfDay

感謝

回答

1

這種表達導致了問題:

Long seconds = (ltime/100)*60*60; 

除法運算符返回整型值,因此你在這裏失去精度。

1130/100 = 11.3 ~ 11 
11 * 60*60 = 39600 
11.3 * 60*60 = 40680 

司應該在你的表達最後一次操作:

Long seconds = (ltime*60*60)/100; 
+0

「1130」字符串推測爲11小時30分鐘tes,這段代碼將該值視爲1130/100小時,這是不相同的。 –

+0

@all對不起我的愚蠢代碼,我在想什麼。是的,建議的解決方案將工作。 @ greg-449'LocalTime localTime = LocalTime.parse(「1130」,DateTimeFormatter.ofPattern(「HHmm」));'這正是我正在尋找的優雅解決方案 - 我知道這樣的事情應該存在。我對這個問題的第二部分有一些我的時間組件,我有一個日期和其他一些我沒有(但我必須將所有東西都轉換爲日期時間。我有什麼時候添加實際日期?我不是看到一個方法LocalDate(日期)?對於其他人將簡單地讓默認爲1970年,除非存在一個soln –

+0

@ Sam-T對不起,但我不明白你問的問題。 –

2

假設字符串「1130」裝置11小時30分鐘,你需要爲小時和分鐘分別做轉換到秒:

long ltime = Long.parseLong("1130"); 

long hoursAsSeconds = (ltime/100) * 60 * 60; 
long minsAsSeconds = (ltime % 100) * 60; 

long secondsOfDay = hoursAsSeconds + minsAsSeconds; 

然後可以使用LocalTime獲得給出秒的本地時間:

LocalTime localTime = LocalTime.ofSecondOfDay(secondsOfDay); 

你也可以直接通過解析這樣的時間獲得本地時間:

LocalDateTime localDateTime = LocalDateTime.of(LocalDate.now(), localTime); 

或使用ZonedDateTime

LocalTime localTime = LocalTime.parse("1130", DateTimeFormatter.ofPattern("HHmm")); 

從,你可以使用像得到了LocalDateTime

ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.now(), localTime, ZoneId.of("America/Los_Angeles"));