因此,我在我正在实现的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