首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii date,hour,minute -> datetime字符串-> MySQL datetime

Yii date,hour,minute -> datetime字符串-> MySQL datetime
EN

Stack Overflow用户
提问于 2011-02-28 11:46:24
回答 3查看 16.2K关注 0票数 1

我正在使用Yii构建一个web应用程序。我的一个输入表单有一个日期的CJuiDatePicker。我有两个下拉列表,一个用于小时,另一个用于分钟。

我的问题出在数据模型中,我试图将表单中的日期、小时和分钟转换为MySQL日期时间字符串。我必须生成一个类似于- 2011-02-27 20:11:56的datetime字符串,这样Yii就可以将该字符串转换为MySQL datetime并将值插入到行中。

在模型中,我有一个规则,看起来像这样:

代码语言:javascript
复制
array('event_datetime_from', 'createDatetime', 
    'date'=>'event_date_from', 'hour'=>'event_hour_from',
    'minute'=>'event_minute_from'),

createDateTime验证器函数如下所示:

代码语言:javascript
复制
public function createDatetime($attribute, $params) {
    if (!$this->hasErrors()) {      
        $date = $this->$params['date'];
        $hour = $this->$params['hour'];
        $minute = $this->$params['minute'];

        if (trim($date) === '') {
            $this->$attribute = null;
        } else {
            $parse = CDateTimeParser::parse(
                $date.' '.$hour.':'.$minute,
                'MM/dd/yyyy hh:mm');
            $this->$attribute = date('Y-m-d H:i:s', $parse);
        }
    }
}

现在,我不是PHP开发人员。但是,在我看来,$params['date']返回的是字符串值event_date_from,而不是event_date_from的值。

我的问题是,如何在createDateTime验证器函数中获取event_date_from的值?

如果我忽略了Yii文档中某处的答案,我深表歉意。我找不到很多验证器函数的例子。Yii验证器类具有与验证器函数不同的参数签名。

根据thaddeusmt的答案编辑:

我尝试扩展CActiveRecord并编写了一个afterValidate方法,但是我找不到一个地方来定义我的工作日期、小时和分钟变量。我在扩展方法中定义了它们,而afterValidate方法看不到它们。我在afterValidate方法中得到了一个PHP未定义的变量错误。

在控制器中,我编写了以下函数:

代码语言:javascript
复制
protected function createDateTime($dateString, $hour, $minute) {
    if (trim($dateString) == '') {
        return null;
    } else {
        $timeString = $dateString.' '.$hour.':'.$minute;
        return date('Y-m-d H:i:s', strtotime($timeString));
    }
}

在PHP中调用函数应该是小菜一碟,对吧?

我在actionCreate()函数中尝试了这两个调用:

代码语言:javascript
复制
$model->event_datetime_from = 
            createDateTime($_POST['event_date_from'],
            $_POST['event_hour_from'],
            $_POST['event_minute_from']
            );

和:

代码语言:javascript
复制
$model->event_datetime_from = 
            createDateTime($model->event_date_from,
            $model->event_hour_from,
            $model->event_minute_from
            );

我的控制器代码会因为这两个调用中的任何一个而终止,并且我会得到一个空白的(没有HTML)响应页面。

我认为我想要做的事情很简单。我希望获取日期、小时和分钟字符串,并将连接转换为日期时间字符串。我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-28 12:34:39

我所做的是,在控制器中的POST操作(分配POST变量的地方)中,使用date()和mktime()函数将发布的日期和时间值转换为MySQL日期时间,然后验证/保存。因此,下面是post操作的一个示例:

代码语言:javascript
复制
public function actionUpdate() {
  $model=$this->loadModel();
  if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model']; // assign the rest of the POST vars here
    $model->event_datetime_from = date(
      'Y-m-d H:i:s', // convert the timestamp to the mySQL format
      mktime(        // create the timestamp from the posted date and time vars
        $_POST['my-hour-var'], // set the hour
        $_POST['my-minute-var'], // set the min
        $_POST['my-second-var'], // set the sec
        date("m"), // set the month
        date("d"), // set the day
        date("Y") // set the year
      )
    ); // create a MySQL Y-m-d H:i:s format date from the POST vars
    $model->save(); // this run the validation rules, naturally
  }
}

(假设有一个名为“模型”的模型,小时、分钟和秒变量分别称为my- POSTed -var、my-my var和my- second -var,并且您将日期部分设置为今天。)

下面是使用CTypeValidator的模型模型中的验证规则的示例

代码语言:javascript
复制
public function rules() {
  return array(
    array('event_datetime_from', 'type', 'type'=>'datetime', 'datetimeFormat'=>'yyyy-MM-dd hh:mm:ss', 'message' => '{attribute} is not a date and time!'),
}

我希望这能帮到你!

票数 3
EN

Stack Overflow用户

发布于 2011-03-02 01:02:32

我强烈建议您查看这个扩展:http://www.yiiframework.com/extension/i18n-datetime-behavior/

它会自动执行其中的一些行为。你可能需要更新它,这取决于你期望你的未来日期看起来是什么样子。一种方法是始终通过strtotime() (内置在php日期解析函数中)运行属性,而不是通过扩展中特定的日期解析器运行。

票数 2
EN

Stack Overflow用户

发布于 2011-02-28 20:44:30

我终于将我的日期、小时和分钟字符串转换为日期时间字符串。

下面是我放入CalendarEventControlleractionCreate方法和actionUpdate方法中的代码

代码语言:javascript
复制
        $model->attributes=$_POST['CalendarEvent'];

        // new code
        $timeString = $_POST['CalendarEvent']['event_date_from'].' '.
            $_POST['CalendarEvent']['event_hour_from'].':'.
            $_POST['CalendarEvent']['event_minute_from'];
        $model->event_datetime_from = 
            date('Y-m-d H:i:s', strtotime($timeString));

        if (trim($_POST['CalendarEvent']['event_date_to']) === '') {
            $model->event_datetime_to = null;
        } else {
            $timeString = $_POST['CalendarEvent']['event_date_to'].' '.
                $_POST['CalendarEvent']['event_hour_to'].':'.
                $_POST['CalendarEvent']['event_minute_to'];
            $model->event_datetime_to = 
                date('Y-m-d H:i:s', strtotime($timeString));
        }

我在这个模型中有两个日期时间字段,第二个字段是可选的。当我把它放在一个函数中时,这段代码不起作用。只有当我将代码内联到两个操作方法中时,它才能起作用。

我想我不理解PHP函数调用。但是,如果其他人遇到这个问题,这里有一个有效的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5137988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档