2013-04-24 57 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