2017-09-26 131 views
-2

我們接收時間爲小時= 11,分鐘= 29,秒= 54,毫秒= 999以及時區信息。將給定區域的LocalTime轉換爲unix中沒有日期分量的時間秒

如何將此時間轉換爲無日期部分的unix時代毫秒。 我曾嘗試這樣的代碼:

ZoneId zoneId = ZoneId.of("America/New_York"); 
    LocalDate now = LocalDate.now(zoneId); 
    long epochMilli = ZonedDateTime.of(LocalDate.now(zoneId).atTime(11, 29, 20, 999 * 1000 * 1000), zoneId).toInstant().toEpochMilli(); 
    long unixEpocSeconds = epochMilli % (24 * 60 * 60 * 1000); //86400000 

    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(zoneId)); 
    calendar.setTimeInMillis(unixEpocSeconds); 
    System.out.println("(= " + (calendar.get(Calendar.HOUR)==11)); 
    System.out.println("(= " + (calendar.get(Calendar.MINUTE)==29)); 
    System.out.println("(= " + (calendar.get(Calendar.SECOND)==20)); 
    System.out.println("(= " + (calendar.get(Calendar.MILLISECOND)==999)); 

如何獲得Unix紀元秒無日期組件i.e.how獲得UTC中區毫秒/而不是給予了zoneid。上面的代碼運行發現,如果了zoneid = UTC

+1

你不能。 unix時代的秒數是*「自unix時代以來的秒數(即1970-01-01T00:00Z')」*。如果你有時間,沒有日期,你怎麼可能計算出來? – 2017-09-26 15:43:46

+0

另一個細節:'toEpochMilli()'返回自unix時期以來的毫秒**數(獲得秒數,而不是調用'getEpochSecond()')。爲了建立一個'ZonedDateTime',你也可以做'ZonedDateTime.of(LocalDate.now(zoneId).atTime(11,29,20,999 * 1000 * 1000),zoneId)' - 比調用'getYear ()','getMonthValue()'等等。 – 2017-09-26 15:48:05

+0

@Hugo謝謝。沒有日期日期,我們無法獲得紀元毫秒。是否有可能獲得午夜UTC時間之後的miliseonds? – RGoyal

回答

0

TL;博士

Duration.ofHours(11L) 
     .plusMinutes(29L) 
     .plusSeconds(54L) 
     .plusMillis(999L) 
     .toMillis() 

跨度的時間隨時間變化的日

你的問題是困惑。 沒有日期的時間與UTC相比毫無意義。自從Unix時期參考日期1970-01-01T00:00:00Z以來的毫秒數是用於跟蹤日期的時間。

我懷疑你實際上是在處理一段時間,並且錯誤地把它當作一天的時間來處理。一個是針對時間線的,另一個則不是。

Duration

的java.time類捆綁與Java 8和更高包括Duration用於處理的時間未連接到時間軸這種跨距。

這些方法採取long數據類型,因此尾隨L。毫秒

Duration d = Duration.ofHours(11L).plusMinutes(29L).plusSeconds(54L).plusMillis(999L) ; 

算你問的毫秒數,所以在這裏你去。謹防數據丟失,因爲Duration可提供更精細的納秒級分辨率,所以在轉換爲毫秒時,您將消除任何更精細的一秒。

long millis = d.toMillis() ; // Converts this duration to the total length in milliseconds. 

但我建議你不代表使用計數的-毫秒的時間軸上的時間跨度,也時刻。更好地使用對象或標準化文本;繼續閱讀。

ISO 8601

ISO 8601標準定義明確的實際格式以表示日期時間值作爲文本。

這包括representation of durations。格式爲PnYnMnDTnHnMnS,其中P標記開始,而T將任何年 - 月 - 日部分與任何小時 - 分鐘 - 秒部分分開。

默認情況下,java.time類在parsetoString方法中使用標準格式。

String output = d.toString() ; 

PT11H29M54.999S

看到這個code run live at IdeOne.com

你可以在java.time中直接解析這樣的字符串。

Duration d = Duration.parse("PT11H29M54.999S") ; 

我建議儘可能使用這種格式,當然在系統之間交換數據時也是如此。

在Java內部工作時,通過Duration周圍的對象而不僅僅是文本。

時間軸

您可以使用Duration對象執行日期時間的數學。例如,在當前特定時區採取當前時間,並添加11個半小時。

ZoneId z = ZoneId.of("Pacific/Auckland") ; 
ZonedDateTime now = ZonedDateTime.now(z) ; 
ZonedDateTime later = now.plus(d) ; 

now.toString():2017-09-27T07:23:31.651 + 13:00 [太平洋/奧克蘭]

later.toString():2017-09-27T18:53 :26.650 + 13:00 [太平洋/奧克蘭]

對於UTC值,請致電toInstantInstant類表示UTC時間軸上的一個時刻,分辨率爲納秒(小於毫秒)。

Instant instant = later.toInstant() ; 
相關問題