2015-05-25 64 views
2

YY = 15(年),d = 150(一年的日),HH = 10(小時)格式如何朱利安轉換爲日期在Java中的 「yyDHH」

Date myDateWrong = new SimpleDateFormat("yyDHH").parse("1515010"); 
Date myDateTrue = new SimpleDateFormat("yyD").parse("15150"); 

myDateTrue是正確的: 30/05/2015。 myDateWrong必須是30/05/2015 10:00:00,但似乎是28/07/2015 18:00:00。這裏有什麼問題?

+1

我還沒有在Java中使用常規的Date類,所以我不能幫你做到這一點。但我一直使用支持[Julian日曆]的[Joda-Time圖書館](http://www.joda.org/joda-time/)(http://www.joda.org/joda -time/cal_julian.html)。所以如果本地Java庫不適合你,你可以考慮使用它。 –

+1

首先,您應該避免使用java Date作爲Julian日曆。 Java Date API被破壞,尤其是涉及複雜的時間處理和計算(例如使用不同的日曆)時。 Java 8有一個新的時間API來修復這些問題,其中Date已被LocalDateTime取代。 Julian日曆在公曆8日由公曆執行。 https://docs.oracle.com/javase/8/docs/api/java/util/GregorianCalendar.html –

+0

您能否澄清一下您對「Julian」一詞的理解?與Julian日曆或Julian日號碼有幾種完全不同的含義。 –

回答

0

你的格式不正確。您應該使用:

Date myDateWrong = new SimpleDateFormat("yydddhh").parse("1515010"); 
0

你需要1515030/05/2015 ...但實際上12:00:00嘗試this

String j = "15150"; 
Date date = new SimpleDateFormat("yyD").parse(j); 
String g = new SimpleDateFormat("dd.MM.yyyy hh:mm").format(date); 
System.out.println(g); 
2

我要去猜測,wrongDate了一位數(如你指定的那樣),然後把這個小時的其餘數字(就像從原始格式的朱利安日期的剩餘數字一樣)。所以你得到了2015年1月和5010小時。我沒有詳細計算,但5010小時會給你大約7個月的時間,這將解釋7月份結束。 18:00小時只反映了剩下的時間。

因此,您需要使用DDD作爲Julian日的說明符(而不是其他評論中提到的ddd),然後按預期出現。

0

TL;博士

LocalDateTime ldt = LocalDateTime.parse ("1515010" , DateTimeFormatter.ofPattern ("yyDHH")); 
LocalDate ld = LocalDate.parse ("15150" , DateTimeFormatter.ofPattern ("yyD")); 

不朱利安...順序日期

使用「朱利安」一詞對於有序天的年數是不是技術上是正確的,但通常仍然使用。我建議你避免與實際的Julian date混淆,並堅持準確的術語ordinal date或「日年」。

java.time

java.time框架構建在Java 8和更高版本可以在這裏幫助。下面的代碼示例證明,您的場景(有或沒有每日時間)在java.time中正確工作。

這些java.time類代替了舊的麻煩的日期時間類,如java.util.Date。見Oracle Tutorial。許多功能已被移植到ThreeTen-Backport中的Java 6 & 7中,並進一步適用於Android的ThreeTenABP

DateTimeFormatter類定義格式化程序模式。格式化代碼與SimpleDateFormat類似,但不完全相同,因此請研究類文檔。通過這門課程,如果省略了世紀,則假定21世紀(20xx)。

String input = "1515010"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("yyDHH"); 

LocalDateTime ldt = LocalDateTime.parse (input , formatter); 

A LocalDateTime缺少任何時區或偏移UTC信息。所以它不是而是代表了時間軸上的一個時刻。如果我們可以假設此輸入旨在處於UTC時區的上下文中,則轉換爲OffsetDateTime

OffsetDateTime odt = ldt.atOffset (ZoneOffset.UTC); 

轉儲到控制檯。

System.out.println ("input: " + input + " | ldt: " + ldt + " | odt: " + odt); 

輸入:1515010 | ldt:2015-05-30T10:00 | odt:2015-05-30T10:00Z

對於沒有時間和沒有時區的日期值,我們實例化一個LocalDate

String input = "15150"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("yyD"); 
LocalDate ld = LocalDate.parse (input , formatter); 

轉儲到控制檯。

System.out.println ("input: " + input + " | ld: " + ld); 

輸入:15150 | ld:2015-05-30