Yii2 以不同的格式显示日期时间

翻译 · forecho · 于 6年前 发布 · 13682 次阅读

原文:Save and Display Date Time Fields in different formats in Yii2

在大多数Yii项目你会发现有一个很常见的需要 - 控制你的日期输入。数据库需要特定格式存储日期字段,而你可能想要在不同的格式显示它在表单和其他视图。

如何管理这种情况容易控制全球的日期格式保存并显示在Yii应用程序?

这里有一些方法:

1. 使用一个预先构建的扩展

最直接和简单的方法之一是使用由 Krajee yii2-datecontrol扩展。这个扩展允许您设置全球格式为日期字段分别保存表单和视图。您可以使用此大部分基于表单的接口,因为它允许您使用各种 INPUTS 和 WIDGETS 。扩展包括开箱即用的支持增强的 DatePicker DateTimePicker,来自 yii2-widgets TimePicker小部件。查看一个完整的演示。

2. 使用时间戳行为自动保存日期/时间记录

通常情况下,你想要自动保存日期时间字段比方说 created_onupdated_on,您可以使用 (\yii\behaviors\TimeStampBehavior)[http://www.yiiframework.com/doc-2.0/yii-behaviors-timestampbehavior.html] 行为。您可以配置行为自动保存的时间戳字段当默认插入和更新事件的瞬间偶极——或者你可以添加额外的事件。

一些额外的建议在使用这种行为:

2.1 格式保存

你可以选择保存一个特定的时间戳值,使用一个预定义的格式。让我们看你有你的后端 datetime 字段定义为一个整数,你想保存它作为一个整数。你可以设置这样的行为:

public function behaviors()
{
    return [
        'timestamp' => [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => 'creation_time',
                ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',
            ],
            'value' => function() { return date('U'); // unix timestamp },
        ],
    ];
}

2.2 保存时间戳除了插入或更新事件

你可能想要保存为自定义场景的时间戳。比方说你想更新 creation_time 特定的控制器动作。在这种情况下您可以触发您的特定属性的更新时间戳通过使用下面的方法:

$model->touch('creation_time');

3. 控制全球的格式

您可以配置 (yii\i18n\formatter)[http://www.yiiframework.com/doc-2.0/yii-i18n-formatter.html] 程序来控制你的全球显示日期的格式为您的语言环境。你可以设置在你的配置文件

'components' => [
 	......
	'formatter' => [
	    'class' => 'yii\i18n\Formatter',
	    'dateFormat' => 'php:d-M-Y',
	    'datetimeFormat' => 'php:d-M-Y H:i:s',
	    'timeFormat' => 'php:H:i:s',
	]
	.....
]

然后你可以在任何地方显示日期时间使用格式化程序指定的格式:

echo Yii::t('app', 'Today is {0, date}', $yourTimeStampAttr);

4. 轻而易举地将任何属性格式保存到数据库之前

如果您不希望使用扩展# 1所提示,您可以创建自己的全球格式保存。只是创建一个 helper 类如下:

class Setup {
    const DATE_FORMAT = 'php:Y-m-d';
    const DATETIME_FORMAT = 'php:Y-m-d H:i:s';
    const TIME_FORMAT = 'php:H:i:s';

    public static function convert($dateStr, $type='date', $format = null) {
        if ($type === 'datetime') {
              $fmt = ($format == null) ? self::DATETIME_FORMAT : $format;
        }
        elseif ($type === 'time') {
              $fmt = ($format == null) ? self::TIME_FORMAT : $format;
        }
        else {
              $fmt = ($format == null) ? self::DATE_FORMAT : $format;
        }
        return Yii::$app->formatter->asDate($dateStr, $fmt);
    }
}

然后其他地方(如控制器/模型)可以访问这个函数将任意输入日期/时间字符串保存到数据库。

$model->dateAttr = Setup::convert($model->dateAttr);
$model->datetimeAttr = Setup::convert($model->datetimeAttr, 'datetime');
本帖已被设为精华帖!
共收到 1 条回复 翻译 Yii2
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册