【问题标题】:Convert datetime in to date将日期时间转换为日期
【发布时间】:2008-12-08 11:55:57
【问题描述】:

如何在不捕获时间的情况下将 Grails 中的日期时间字段转换为日期?我需要这样做以与系统日期进行比较。

class Trip 
{
    String name
    String city
    Date startDate
    Date endDate
    String purpose
    String notes

    static constraints = {
        name(maxLength: 50, blank: false)
        startDate(validator: {return (it >= new Date())}) // This won't work as it compares the time as well 
        city(maxLength: 30, blank: false)
    }
}

【问题讨论】:

    标签: datetime grails groovy


    【解决方案1】:

    [不幸的是]Grails|Groovy|Java 中没有执行此操作的“开箱即用”方法。

    有人总是在任何时候提出java.util.Datejava.util.Calendar 问题时都会抛出Joda-Time,但包含另一个库并不总是一种选择。

    最近,对于一个类似的问题,我们创建了一个 DateTimeUtil 类,其中包含 static 方法和类似以下的方法来仅获取 Date

    class DateTimeUtil {
    
        // ...
    
        public static Date getToday() {
            return setMidnight(new Date())
        }
    
        public static Date getTomorrow() {
            return (getToday() + 1) as Date
        }
    
        public static Date setMidnight(Date theDate) {
            Calendar cal = Calendar.getInstance()
            cal.setTime(theDate)
            cal.set(Calendar.HOUR_OF_DAY, 0)
            cal.set(Calendar.MINUTE, 0)
            cal.set(Calendar.SECOND, 0)
            cal.set(Calendar.MILLISECOND, 0)
            cal.getTime()
        }
    
        //...
    
    }
    

    然后,在验证器中,你可以使用

    startDate(validator: {return (it.after(DateTimeUtil.today))}) //Groovy-ism - today implicitly invokes `getToday()` 
    

    【讨论】:

    • 似乎是我一直在寻找的解决方案,但是由于某些奇怪的原因它不起作用。即使我添加了新类,验证也不起作用。有什么我想念的吗?谢谢
    • 嗯……它怎么“不工作”?我的意思是,控制台上是否有任何错误、警告或消息?它只是不调用验证吗?验证是否返回“误报”?
    【解决方案2】:

    我破解了:

    startDate(validator: {return (it >= new Date()-1)})

    就这么简单;-)

    要更改 GSP 页面中的视图:

    <g:datePicker name="startDate" value="${trip?.startDate}" years="${years}"  precision="day" />
    

    感谢大家的贡献

    【讨论】:

    • 只要“startDate”验证晚于或等于 24 小时前(即昨天某个时间)是可以的,酷!我认为,鉴于我对问题的[有限]理解,我会放弃“>=”并使用“>”(或 Date.after(Date))
    【解决方案3】:

    在 Grails 中更好地使用日历插件。

    【讨论】:

      【解决方案4】:

      你应该使用startdate.clearTime()

      我们通过覆盖只需要日期而不需要时间的域类的设置器来做到这一点。这样,我们可以比较两个实例的日期,而不必稍后再做。 :

      def setStartDate( Date date ) {
          date.clearTime()
          startDate = date
      }
      

      【讨论】:

        【解决方案5】:

        尝试使用 'java.sql.Date' 而不是 'java.util.Date' 作为 Date 属性的类型以及

        格式日期

        目的

        允许使用 SimpleDateFormat 类定义的相同模式格式化 java.util.Date 实例。

        示例

        说明

        属性

        * format (required) - The format to use for the date
        * date (required) - The date object to format
        

        【讨论】:

          【解决方案6】:

          我知道晚了,但是这些天,不要使用 Date,使用 LocalDate。在 Grails / groovy GORM 中运行良好,这是新的 Java 做事方式。

          【讨论】:

            【解决方案7】:

            您是否尝试过使用jodatime?它使在 java 中处理日期和时间变得更加容易。

            【讨论】:

              【解决方案8】:

              也许

              startDate(validator: {d = new Date(); return (it..d) >= 0})
              

              【讨论】:

                猜你喜欢
                • 2014-07-01
                • 2013-09-20
                • 1970-01-01
                • 2014-06-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多