本文介紹了無(wú)法將日期轉(zhuǎn)換為紀(jì)元時(shí)間的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
這是我的示例代碼
String dt = "Oct 24 2019 12:00:00.000 AM UTC";
String dt1="Oct 24 2019 11:59:59.000 PM UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS
aa zzz");
Date date = df.parse(dt);
Date date1 = df.parse(dt1);
long epoch = date.getTime();
long epoch1 = date1.getTime();
System.out.println(epoch);
System.out.println(epoch1);
此處指定AM和PM,但不接受該值并將異常拋出為
{"error_code":"INVALID_PARAMETER_VALUE","message":"Time range must have a start time earlier than the end time"}
如何在Java代碼中指定AM/PM。
如何在Java代碼中將昨天的日期和時(shí)間作為輸入以轉(zhuǎn)換為紀(jì)元。
推薦答案
tl;dr
ZonedDateTime
.parse(
"Oct 24 2019 12:00:00.000 AM UTC" ,
DateTimeFormatter.ofPattern( "MMM d uuuu hh:mm:ss.SSS a z" ).withLocale( Locale.US )
)
.toInstant()
.toEpochMilli()
1571875200000
java.time
兩個(gè)問(wèn)題:
作為commented by Heuberger,您使用的格式代碼不正確。
您正在使用幾年前被現(xiàn)代java.time類取代的糟糕的Date-Time類。
為清楚起見(jiàn),已重命名您的輸入。
String inputStart = "Oct 24 2019 12:00:00.000 AM UTC";
String inputStop = "Oct 24 2019 11:59:59.000 PM UTC";
定義與您的輸入匹配的格式模式。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM d uuuu hh:mm:ss.SSS a z" ).withLocale( Locale.US );
分析輸入。
ZonedDateTime zdtStart = ZonedDateTime.parse( inputStart , f );
ZonedDateTime zdtStop = ZonedDateTime.parse( inputStop , f );
計(jì)算運(yùn)行時(shí)間。我們應(yīng)該比24小時(shí)少一秒。
Duration d = Duration.between( zdtStart , zdtStop );
顯然,您想要的是自UTC,1970-01-01T00:00Z中1970年第一個(gè)時(shí)刻的紀(jì)元參考以來(lái)的毫秒數(shù)。首先從每個(gè)ZonedDateTime
中提取構(gòu)建塊類Instant
。Instant
表示UTC中的時(shí)刻。這門課讓你審問(wèn)自紀(jì)元以來(lái)的伯爵。注意,java.time類以納秒為單位進(jìn)行解析。因此,請(qǐng)求毫秒可能會(huì)導(dǎo)致數(shù)據(jù)丟失,忽略任何微秒或納秒。
Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;
long millisStart = start.toEpochMilli() ;
long milliStop = stop.toEpochMilli() ;
轉(zhuǎn)儲(chǔ)到控制臺(tái)。
System.out.println( "zdtStart = " + zdtStart );
System.out.println( "zdtStop = " + zdtStop );
System.out.println( "d = " + d );
System.out.println( "start = " + start );
System.out.println( "stop = " + stop );
System.out.println( "millisStart = " + millisStart );
System.out.println( "milliStop = " + milliStop );
zdtStart=2019-10-24T00:00Z[UTC]
zdtStop=2019-10-24T23:59:59Z[UTC]
d=PT23H59M59S
開(kāi)始=2019-10-24T00:00:00Z
Stop=2019-10-24T23:59:59Z
毫秒開(kāi)始=1571875200000
毫秒停止=1571961599000
關(guān)于java.time
java.time框架內(nèi)置于Java 8及更高版本中。這些類取代了麻煩的舊legacy日期-時(shí)間類,如java.util.Date
、Calendar
、&;SimpleDateFormat
。
要了解更多信息,請(qǐng)參閱Oracle Tutorial。和搜索堆棧溢出以獲取許多示例和解釋。規(guī)范為JSR 310。
Joda-Time項(xiàng)目現(xiàn)在位于maintenance mode中,建議遷移到j(luò)ava.time類。
您可以直接與數(shù)據(jù)庫(kù)交換java.time對(duì)象。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*
類。
從哪里獲取java.time類?
Java SE 8、Java SE 9、Java SE 10、Java SE 11以及更高版本–標(biāo)準(zhǔn)Java API的一部分,具有捆綁實(shí)現(xiàn)。
Java 9添加了一些次要功能和修復(fù)。
Java SE 6和Java SE 7
大部分java.time功能已后移植到ThreeTen-Backport中的Java 6&;7。
Android
更高版本的Android綁定實(shí)現(xiàn)java.time類。
對(duì)于更早版本的Android(<;26),ThreeTenABP項(xiàng)目適配ThreeTen-Backport(如上所述)。請(qǐng)參閱How to use ThreeTenABP…。
ThreeTen-Extra項(xiàng)目使用其他類擴(kuò)展了java.time。該項(xiàng)目為將來(lái)可能添加到j(luò)ava.time中提供了一個(gè)試驗(yàn)場(chǎng)。您可以在此處找到一些有用的類,如Interval
、YearWeek
、YearQuarter
和more。
這篇關(guān)于無(wú)法將日期轉(zhuǎn)換為紀(jì)元時(shí)間的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,