因此,我在我正在實現的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無關。此時,我不知所措。任何人有想法?
感謝
您使用DateTime作爲另一個對象中的字段?或者只是將它返回到視圖? – Will 2013-04-24 22:49:16
我基本上使用DateTime作爲我程序中的任何日期。所以我在域名類,表單等上面有這個 – 2013-04-25 00:11:37