【问题标题】:Groovy / Grails / Gorm dates with no minutes.Groovy / Grails / Gorm 没有分钟的日期。
【发布时间】:2015-07-07 19:01:57
【问题描述】:

我有一个带日期的复合主键。

id composite: ["division", "expenseDate"]

String division
Date expenseDate

def getPK() {
    ["division":division, "expenseDate":expenseDate]
}

我正在生成这样的页面链接。

<g:link controller="recoveryDetail" action="edit" params="${it.getPK()}">
    <g:formatDate format="MM/dd/yyyy" date="${it.expenseDate}" />
</g:link>

我最终得到一个像这样生成的 URL

http://localhost:8080/pisr/recoveryDetail/edit?division=BUFFALO&expenseDate=2007-04-25+00%3A00%3A00.0

我想消除出现在 URL 中的时间。

我还发现很难将对象与来自数据库的日期时间为零的事实进行比较,但我的本地对象具有本地时间。示例“部门”:“BUFFALO”,“expenseDate”:“2015-07-07T04:00:00Z”。如何返回零时间而不是本地时间。

最后,我使用了 grails datePicker 组件,当我收到带有参数的日期时,我得到了expenseDate_day:7, expenseDate_year:2015, expenseDate_month:7。如何将这些转换回 groovy 中的日期对象,以便可以对日期执行以下查询?

RecoveryDetail.createCriteria().get  {
    eq("division", recoverySetupInstance.division)
    eq("expenseDate", expenseDate)
}

【问题讨论】:

  • 您的第一个问题与日期格式有关,您可以使用 formatDate 或 simpleDateFormat 将日期格式化为 dd-mm-yyyy 或任何您想要的格式。 grails.github.io/grails-doc/latest/ref/Tags/formatDate.html。那是gsps。在控制器中,您可以执行 g.formatDate(format:"yyyy-MM-dd" date:"${date}")。第二个问题是一样的 - 只需使用对象在另一边做一个日期。
  • @vahid 在控制器中用于什么标签 formatDate?您在 Date 对象中有一个漂亮的方法:格式(字符串格式)。所以改为 g.formatDate(format:"yyyy-MM-dd" date:"${date}") 你可以只写: date.format("yyyy-MM-dd")

标签: grails groovy


【解决方案1】:

我会在来自 Koloritnij 的评论后尝试回答这个问题

在这种情况下,解决方法是更改​​ getPK 以正确格式化日期。所有代码迷都通过 getPK 在 domainClass 中创建自己的参数映射,当 gsp 需要时,他可以手动执行:

以下是 GSP 中的不同样式,顶部是此实例所需的正确调用:

<g:link action="edit" params="${instance.getPK2()}">
<g:formatDate format="MM/dd/yyyy" date="${instance.expenseDate}" />  - PK2 WAY
</g:link><br>

<g:link action="edit" params="${instance.getPK()}">
<g:formatDate format="MM/dd/yyyy" date="${instance.expenseDate}" />  - PK WAY
</g:link><br>

<g:link action="edit" params="${["division":instance.division, "expenseDate":g.formatDate(format:'MM/dd/yyy', date:instance.expenseDate)]}">
<g:formatDate format="MM/dd/yyyy" date="${instance.expenseDate}" />  - Formatted using g.format
</g:link><br>

<g:link action="edit" params="${["division":instance.division, "expenseDate":instance.expenseDate.format("MM/dd/yyy")]}">
    <g:formatDate format="MM/dd/yyyy" date="${instance.expenseDate}" />  - Formatted using format
</g:link><br>

不同的 GSP 样式做相同的事情。

带有新 getPK2 的 DomainClass(在核心处格式化日期)

class RecoveryDetail {

    //id composite: ["division", "expenseDate"]

    String division
    Date expenseDate

    def getPK() {
        ["division":division, "expenseDate":expenseDate]
    }

    def getPK2() {
        ["division":division, "expenseDate":expenseDate.format("MM/dd/yyy")]
    }
}

你的控制器输出这个:

class RecoverDetailController {
    def index() {
        def instance = RecoveryDetail.findByDivision('foo')
        [instance:instance]
    }

    def edit() { 
        render "params are ${params}"
        // -PK2 way:
        //params are [division:foo, expenseDate:07/08/2015, action:edit, format:null, controller:recoverDetail]

        // - PK WAY
        // params are [division:foo, expenseDate:2015-07-08 17:53:48.565, action:edit, format:null, controller:recoverDetail]

        //- Formatted using g.format
        //params are [division:foo, expenseDate:07/08/15, action:edit, format:null, controller:recoverDetail]

        //- Formatted using format
        //params are [division:foo, expenseDate:07/08/2015, action:edit, format:null, controller:recoverDetail]
    }

}

在虚拟测试条目中加载您的引导程序:

import test.RecoveryDetail
class BootStrap {
    def init = { servletContext ->
        RecoveryDetail.findOrSaveWhere(division: 'foo', expenseDate:new Date()).save(flush:true)
    }
}

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2023-03-22
    • 2013-10-04
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多