java 格式化日期到毫秒_关于日期:Java – SimpleDateFormat格式化程序,以毫秒为单位返回纪元时间...
本問題已經有最佳答案,請猛點這里訪問。
我是Java和編碼的新手 - 我有一些代碼以下列格式yyyy.MM.dd HH:mm:ss:ms返回時間戳,如下所示:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:sss");
返回:
2017.07.19 11:42:30:423
有沒有辦法編輯上面的"SimpleDateFormat格式化程序"代碼,將日期/時間作為包含毫秒的紀元時間戳返回,以便返回的值按照下面的格式進行格式化?
1500464550423
我希望我可以修改SimpleDateFormat formatter代碼的("yyyy.MM.dd HH:mm:ss:sss")部分來執行此操作。
非常感謝任何幫助或建議。
謝謝
這對我來說不是100%清楚。 你是說你收到2017.07.19 11:42:30:423作為一個字符串,你想將它轉換為自紀元以來的毫秒數?
這是正確的 - 時間戳值后來在代碼中使用并用于創建一個變量字符串 - 返回時間戳的部分是"+ formatter.format(time)"而沒有引號 - 這就是我希望的原因 我可以修改("yyyy.MM.dd HH:mm:ss:sss")部分代碼,以毫秒為單位返回epoc,因為我不知道如何修改代碼以使用人們在這里建議的其他方法。..
在格式模式字符串中使用大小寫時遇到一個簡單的錯誤(這些區分大小寫)。更糟糕的是,你正在使用舊的麻煩的SimpleDateFormat類。它的許多問題之一是它沒有告訴你問題是什么。
所以我建議您使用現代Java日期和時間API(我故意使用您的格式模式字符串逐字):
String receivedTimetamp ="2017.07.19 11:42:30:423";
DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:sss");
LocalDateTime dateTime = LocalDateTime.parse(receivedTimetamp, parseFormatter);
System.out.println(dateTime);
此代碼拋出IllegalArgumentException: Too many pattern letters: s。我希望這可以讓你意識到這樣一個事實,即你使用的是兩秒鐘的秒數和三秒鐘的秒數。如果仍然不清楚,文檔將告訴您小寫s在幾秒內是正??確的,而分數需要大寫s。我們來修理:
DateTimeFormatter parseFormatter
= DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS");
現在代碼打印2017-07-19T11:42:30.423,因此我們設法正確解析字符串。
要轉換為毫秒,我們仍然缺少一個重要的信息:在什么時區應該解釋時間戳?我認為兩個明顯的猜測是UTC和你當地的時區(我不知道)。試試UTC:
System.out.println(dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli());
這會產生1500464550423,這是您要求的數字。我想我們已經完成了。
如果您想要JVM的時區設置,請使用.atZone(ZoneId.systemDefault())而不是.atOffset(ZoneOffset.UTC),但要注意該設置可能會被同一JVM中運行的其他軟件更改,因此這很脆弱。
感謝您提供了很好的解釋 - 我很難理解如何將它集成到我的代碼中,因為我對Java很新,但是我不懷疑你的建議是否正確 - 我需要花一些時間來工作這個
首先,查看SimpleDateFormat的文檔。對應于毫秒的模式是大寫S,而小寫S對應于秒。問題是SimpleDateFormat通常不會抱怨并嘗試以秒為單位解析423,將此金額添加到結束日期(給出不正確的結果)。
無論如何,SimpleDateFormat只是將String解析為java.util.Date或將Date格式化為String。如果你想要epoch millis值,你必須從Date對象獲取它:
// input string
String s ="2017.07.19 11:42:30:423";
// use correct format ('S' for milliseconds)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:SSS");
// parse to a date
Date date = formatter.parse(s);
// get epoch millis
long millis = date.getTime();
System.out.println(millis); // 1500475350423
問題是SimpleDateFormat使用系統的默認時區,因此上面的最終值(1500475350423)將等于系統時區中的特定日期和時間(可能與您的時區不同 - 僅用于記錄,我的系統的默認時區是America/Sao_Paulo)。如果要指定此日期在哪個時區,則需要在格式化程序中設置(在調用parse之前):
// set a timezone to the formatter (using UTC as example)
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
這樣,millis的結果將是1500464550423(相當于UTC中的指定日期和時間)。
要執行相反的操作(從millis值創建日期),您必須創建一個Date對象,然后將其傳遞給格式化程序(同時注意設置格式化程序的時區):
// create date from millis
Date date = new Date(1500464550423L);
// use correct format ('S' for milliseconds)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// format date
String formatted = formatter.format(date);
Java新的日期/時間API
舊類(Date,Calendar和SimpleDateFormat)存在許多問題和設計問題,并且它們將被新API替代。
如果您使用的是Java 8,請考慮使用新的java.time API。與舊的API相比,它更容易,更少出錯并且更不容易出錯。
如果您使用Java <= 7,則可以使用ThreeTen Backport,這是Java 8的新日期/時間類的一個很好的后端。對于Android,還有ThreeTenABP(更多關于如何在這里使用它)。
以下代碼適用于兩者。
唯一的區別是包名稱(在Java 8中是java.time,在ThreeTen Backport(或Android的ThreeTenABP)中是org.threeten.bp),但類和方法名稱是相同的。
由于輸入String沒有時區信息(僅限日期和時間),首先我將其解析為LocalDateTime(表示沒有時區的日期和時間的類)。然后我將此日期/時間轉換為特定時區并從中獲取millis值:
// input string
String s ="2017.07.19 11:42:30:423";
// use correct format ('S' for milliseconds)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS");
// as the input string has no timezone information, parse it to a LocalDateTime
LocalDateTime dt = LocalDateTime.parse(s, formatter);
// convert the LocalDateTime to a timezone
ZonedDateTime zdt = dt.atZone(ZoneId.of("Europe/London"));
// get the millis value
long millis = zdt.toInstant().toEpochMilli(); // 1500460950423
該值現在1500460950423,相當于倫敦時區的指定日期和時間。
請注意,API使用IANA時區名稱(始終采用Region/City格式,如America/Sao_Paulo或Europe/Berlin)。
避免使用3個字母的縮寫(如CST或PST),因為它們不明確且不標準。
您可以通過調用ZoneId.getAvailableZoneIds()獲取可用時區列表(并選擇最適合您系統的時區)。
如果要使用UTC,也可以使用ZoneOffset.UTC常量。
相反,您可以獲取millis值來創建Instant,將其轉換為時區并將其傳遞給formatter:
// create Instant from millis value
Instant instant = Instant.ofEpochMilli(1500460950423L);
// use correct format ('S' for milliseconds)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss:SSS");
// convert to timezone
ZonedDateTime z = instant.atZone(ZoneId.of("Europe/London"));
// format
String formatted = z.format(formatter);
你可以試試
long time = System.currentTimeMillis();
我認為op希望從字符串日期開始
你是對的......然而,這個問題沒有說明
這只是對一個問題的回答......假設作者正在從系統中取出日期
String strDate ="Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter dtf ?= DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
ZonedDateTime ? ? zdt ?= ZonedDateTime.parse(strDate,dtf);
System.out.println(zdt.toInstant().toEpochMilli()); ?// 1055545912454
很好的代碼,但缺乏解釋。僅限代碼的答案很少有用,請解釋您如何解決提問者的問題。
這個主題可能會有所幫助stackoverflow.com/questions/6687433/…
第一個建議是轉移到java8 java.time API而不是學習損壞的java.date API
然后做:
Instant i = Instant.now();
System.out.println(i.toEpochMilli());
在你的情況下你可以做:
LocalDateTime myldt = LocalDateTime.parse("2017-06-14 14:29:04",
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(myldt.toInstant(ZoneOffset.UTC).toEpochMilli());
請注意,只要您使用api玩更多內容,您就會找到更多方法來實現相同的目標,最后您將結束調用toEpochMilli
感謝您的評論 - 我上面引用的代碼是代碼塊的一部分,我不確定如何集成您建議的內容 - 理想情況下我需要了解是否/如何使用"SimpleDateFormat"函數返回epoch timestamp因為這意味著我不需要重新jig任何其他代碼,因為我的理解是有限的
是。而不是使用SimpleDateFormat使用DateTimeFormatter
謝謝,我將有一個游戲,看看我是否可以在代碼中為"DateTimeFormatter"字面交換"SimpleDateFormat"并使用"SSS"作為格式化程序(?) - 我對java很新,所以請原諒我的無知!
你將需要java 8來使用該類
如果你有java.util.Date那么調用getTime()將返回自紀元以來的millis數。例如:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss:sss");
Date dateToBeFormatted = new Date();
// this will print a datetime literal on the above format
System.out.println(formatter.format(dateToBeFormatted));
// this will print the number of millis since the Java epoch
System.out.println(dateToBeFormatted.getTime());
這里的關鍵點是,為了獲得自紀元以來的毫秒數,您不需要SimpleDateFormatter,因為自紀元以來的毫秒數是Date的屬性。
感謝您的評論 - 我上面引用的代碼是代碼塊的一部分,我不確定如何集成您建議的內容 - 理想情況下我需要了解是否/如何使用"SimpleDateFormat"函數返回epoch timestamp因為這意味著我不需要重新jig任何其他代碼,因為我的理解是有限的
我已經更新了答案以包含一個例子,希望有所幫助。
謝謝你的故障 - 這對我的理解有幫助!
總結
以上是生活随笔為你收集整理的java 格式化日期到毫秒_关于日期:Java – SimpleDateFormat格式化程序,以毫秒为单位返回纪元时间...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python入门基础篇 No.8 ——
- 下一篇: GTX960M安装tensorflow-