2014-04-01 61 views
2

考慮下面的代碼:java.time ::的toString(字符串模式)方法缺少

public static void main(String[] args) { 

    String pattern = "MMM dd, yyyy HH:mm:ss a z"; 

    // joda-time 
    DateTime dt = DateTime.now(); 
    System.out.println(dt.toString(pattern)); 

    // java.time 
    ZonedDateTime ldt = ZonedDateTime.now(); 
    System.out.println(ldt.toString(pattern)); // doesn't exist 
    System.out.println(ldt.format(DateTimeFormatter.ofPattern(pattern))); 
} 

喬達時類(DateTimeLocalDate,等等)包括一個toString方法接受的格式的字符串你通緝。這是一個非常方便的方法。然而,java-8實現忽略了這種方法。相反,您需要撥打format(DateTimeFormatter formatter)

一個小抱怨,當然。但我的問題是:是否有任何理由從時間省略?由於這個小的省略,將我的應用程序從joda-time轉換爲java.time會更加困難。但是,如果有合乎邏輯的原因,我可以。並不是說你在這裏是爲了緩解我的擔憂,但我想我會問,以防萬一。

編輯:對近親選民,這不是一個基於意見的問題。任何熟悉joda-time/java.time內部工作的人以及他們以某種方式發展的動機都有資格回答這個問題,即使他們從來不這樣做。

+0

請注意,喬達時間仍然是一個圖書館的地獄,沒有真正的理由(除非你需要保存500KB的'.jar'存儲)切換。 –

+0

然後,java.time的主要目的是爲了防止新項目需要焦點時間? – ryvantage

+0

@ryvantage「java.time」的作者是JodaTime的作者。所以我會說'java.time'是JodaTime的精神繼承者。 –

回答

5

一個有趣的問題。 Joda-Time和java.time(JSR-310)具有不同的設計中心 - Joda-Time是一個開源庫,但java.time是JDK的擴展。一個實際的含義是方法計數的壓力更大,這是一個因素。

在喬達,時間問題的方法之一四:

  • toString()
  • toString(DateTimeFormatter dtf)
  • toString(String pattern)
  • toString(String pattern, Locale loc)

首先是Java的標準方法所以默認包含。基於格式化程序的方法非常方便,因爲您可以只使用格式化程序本身。這兩種基於模式的方法更方便,因爲它們只是創建一個格式化程序。

但是請注意,基於模式的方法需要兩個變體,一個變體和一個沒有語言環境,而格式化程序在內部嵌入語言環境(因此不需要方法變體)。在考慮JSR-310時,額外的區域設置方法的需求很重。

另一個考慮是緩存/性能。 Joda-Time爲格式化程序提供模式緩存,以避免重新分析模式,如「yyyy-MM-dd」。這種緩存在JDK中不太受歡迎,因此希望找到一種無法緩存的方法。

具有java.time的格式化程序的推薦方法是將它們分配給靜態變量。新的格式化程序是線程安全的(與舊的不同),所以這個工作很好。另外,爲格式化程序定義一個常量意味着模式的解析只出現一次 - 常量存儲內部數據結構以準備格式化/解析。

private static final DateTimeFormatter FORMATTER = 
       DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss a z"); 
public static void main(String[] args) { 
    ZonedDateTime ldt = ZonedDateTime.now(); 
    System.out.println(ldt.format(FORMATTER); 
} 

最後,JSR-310中的方法最初被稱爲toString(DateTimeFormatter)。 Oracle內部的內部評論建議將方法重命名爲format(DateTimeFormatter)

+0

因此,實用性(更少的方法,沒有緩存)與便利性,實用性勝出JDK。謝謝!很高興聽到消息來源。 – ryvantage

1

我所說的任何事情都是猜測,因爲您必須與新日期時間API的作者進行交談才能真正發現。

我猜他們決定使用格式化程序,因爲它更符合語義,更符合你的要求實際上試圖做的:格式化特定區域設置的日期。儘管toString採取了一種模式,但簽名toString(String)並不完全直觀。此外,最好有一個處理日期格式的專用方法,而不是超載Object#toString。它絕對是一個更清潔的API。

同樣,正如我所說,這是推測,以便得到真正的答案,你將不得不去源。但如果我正在做這樣的事情,這些將是我的理由。

1

format替代方案的決定性優勢是可以共享單個DateTimeFormatter(這不是舊的不可靠的unthreadsafe DateFormatter)。

API報價:

從模式創建的格式可以作爲根據需要多次 ,這是不可改變的,是線程安全的。

沒有兩個都是API設計的清潔問題。

所以這個API借給一個寫:

final DateTimeFormatter DTF = 
     DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm:ss a z")); 
... 
System.out.println(ldt.format(DTF));