7

我在一个 grails 项目中工作。我在我的应用程序中使用剑道网格。我需要创建一个名为“StatTimings”的域类,其中包含两个时间字段 startTime 和 endTime。我不能对这两个变量使用“日期”数据类型,因为我需要的时间格式是 hh:mm。我不想为此安装任何插件。这是我现在的域:

class StatTimings{

???? startTime
???? endTime
Date date
AutoPosting autoPosting
Status status

static constraints = {
}

enum Status{ACTIVE,INACTIVE}
enum AutoPosting{SERVICE_CHARGE,STAT_CHARGES,BOTH}

}

有什么办法可以让我的领域只接受时间?

4

3 回答 3

3

为了便于持久化和绑定(来自 HTTP 参数)该类的实例,我将每次表示为两个整数字段并添加一些辅助方法,例如getStartTime()and getEndTime()。如果您需要执行诸如计算开始时间和结束时间之间的差异之类的操作,您可能希望将这些帮助程序更改为返回 aDate而不是 a (其中日期部分设置为今天)。String

class StatTimings {

  static transients = ['startTime', 'endTime']

  Integer startHours
  Integer startMins

  Integer endHours
  Integer endMins

  private String formatTime(Integer hours, Integer mins) {
    String formattedHours = hours < 10 ? "0$hours" : hours.toString()
    String formattedMins = mins < 10 ? "0$mins" : mins.toString()
    "$formattedHours:$formattedMins"
  }

  String getStartTime() {
    formatTime(startHours, startMins)          
  }

  String getEndTime() {
    formatTime(endHours, endMins)
  }

  static constraints = {
    startHours range: 0..23
    endHours range: 0..23

    startMins range: 0..59
    endMins range: 0..59

    // TODO: add a custom validator that checks the end time is after start time
  }
}
于 2012-05-30T11:00:51.377 回答
2

您可以使用 Date 并在getStartTime()方法中将其转换为您需要的格式SimpleDateFormat。这样你就忽略了它的日期部分。

class StatTimings {
    ...

    def getStartTime() {
        return new SimpleDateFormat("hh:mm").format(this.startTime);
    }

}
于 2012-05-30T10:23:38.670 回答
1

java.sql.Time 类是 java.util.Date 的子类,它几乎做同样的事情,它添加了一个自定义 toString 实现,如下所示:

public String toString () {

    int hour = super.getHours();
    int minute = super.getMinutes();
    int second = super.getSeconds();
    String hourString;
    String minuteString;
    String secondString;

    if (hour < 10) {
        hourString = "0" + hour;
    } else {        
        hourString = Integer.toString(hour);
    }
    if (minute < 10) {
        minuteString = "0" + minute;
    } else {        
        minuteString = Integer.toString(minute);
    }
    if (second < 10) {
        secondString = "0" + second;
    } else {        
        secondString = Integer.toString(second);
    }
    return (hourString + ":" + minuteString + ":" + secondString);
}

所以我想你可以在引导程序上动态地向 Date 类添加一个方法,并在需要时调用它。

您可以在此处查看完整的源代码。

于 2012-05-29T13:00:51.013 回答