2013-04-24 45 views
1

因此,我在我正在實現的grails項目中使用JodaTime插件,我真的不喜歡它在我執行toString時吐出ISO8601日期格式。我一直在不斷的把toString和消息文件中的default.date.format傳入,但這很麻煩。大多數情況下,我只是希望它自動執行此操作。所以很自然地利用Groovy的神話般的元編程來覆蓋DateTime類的toString。但是,它不起作用。因此,本次討論:在Groovy中重寫Joda DateTime toString

http://jira.codehaus.org/browse/GROOVY-4210

所以根據所述的討論,如果我們的類實現來實現我們需要重寫接口的元類toString方法的接口。查看joda代碼庫,DateTime實現ReadableDateTime接口,繼而從ReadableInstant繼承,這是定義方法簽名的地方。實際實現在DateTime的類層次結構中完成了4個類(DateTime繼承自BaseDateTime,繼承自AbstractDateTime繼承自AbstractInstant,它實現了不帶參數的toString)。和我一起到目前爲止?

所以在理論上這意味着我應該重寫實際上沒有toString簽名的ReadableDateTime接口或者它的ReadableInstant接口。以下代碼在ReadableDateTime上重寫toString不會執行任何操作。

ReadableDateTime.metaClass.toString = { -> 
    delegate.toString(messageSource.getMessage(
     'default.date.format', null, LCH.getLocale())) 
} 

因此然後用ReadableInstant嘗試:

ReadableInstant.metaClass.toString = { -> 
    delegate.toString(messageSource.getMessage(
     'default.date.format', null, LCH.getLocale())) 
} 

也沒有對則DateTime.ToString方法所需的結果。但是,這裏有一些有趣的影響。看看下面的代碼:

def aiToString = AbstractInstant.metaClass.getMetaMethod("toString", [] as Class[]) 
def adtToString = AbstractDateTime.metaClass.getMetaMethod("toString", [] as Class[]) 
def bdtToString = BaseDateTime.metaClass.getMetaMethod("toString", [] as Class[]) 
def dtToString = DateTime.metaClass.getMetaMethod("toString", [] as Class[]) 

def date = new DateTime() 
println "ai: ${aiToString.invoke(date)} " 
println "adt: ${adtToString.invoke(date)} " 
println "bdt: ${bdtToString.invoke(date)} " 
println "dt: ${dtToString.invoke(date)} " 

第3種方法顯示我的日期格式的我是多麼的想它。最後一個仍然顯示ISO8601格式化日期。我想也許爲grails的JodaTime插件可能會重寫toString,他們會添加一些方法到這些接口,但與toString無關。此時,我不知所措。任何人有想法?

感謝

+0

您使用DateTime作爲另一個對象中的字段?或者只是將它返回到視圖? – Will 2013-04-24 22:49:16

+0

我基本上使用DateTime作爲我程序中的任何日期。所以我在域名類,表單等上面有這個 – 2013-04-25 00:11:37

回答

0

您水溼覆蓋DateTime#toString(),becouse DateTime類是final

public final class DateTime 

但是如果你想要其他日期格式,可以使用toString(org.joda.time.format.DateTimeFormatter)
例如

def date = new DateTime(); 
date.toString(ISODateTimeFormat.basicDate()); // format yyyyMMdd 
+0

這是真的嗎?我可以添加一個新的方法到DateTime類,我似乎無法重寫toString方法? – 2013-04-30 19:05:07