PHPIN.NET

 找回密码
 立即注册
查看: 6486|回复: 0

[技巧手记] Yii2 以不同的格式显示日期时间

[复制链接]

469

主题

31

回帖

5563

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5563
发表于 2016-6-23 17:43:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Yii2 以不同的格式显示日期时间
在大多数Yii项目你会发现有一个很常见的需要 - 控制你的日期输入。数据库需要特定格式存储日期字段,而你可能想要在不同的格式显示它在表单和其他视图。
如何管理这种情况容易控制全球的日期格式保存并显示在Yii应用程序?
这里有一些方法:
1. 使用一个预先构建的扩展
最直接和简单的方法之一是使用由 Krajee yii2-datecontrol扩展。这个扩展允许您设置全球格式为日期字段分别保存表单和视图。您可以使用此大部分基于表单的接口,因为它允许您使用各种 INPUTS 和 WIDGETS 。扩展包括开箱即用的支持增强的 DatePicker DateTimePicker,来自 yii2-widgets TimePicker小部件。查看一个完整的演示。
2. 使用时间戳行为自动保存日期/时间记录
通常情况下,你想要自动保存日期时间字段比方说 created_on 和 updated_on,您可以使用 (\yii\behaviors\TimeStampBehavior)[http://www.yiiframework.com/doc-2.0/yii-behaviors-timestampbehavior.html] 行为。您可以配置行为自动保存的时间戳字段当默认插入和更新事件的瞬间偶极——或者你可以添加额外的事件。
一些额外的建议在使用这种行为:
2.1 格式保存
你可以选择保存一个特定的时间戳值,使用一个预定义的格式。让我们看你有你的后端 datetime 字段定义为一个整数,你想保存它作为一个整数。你可以设置这样的行为:
  1. public function behaviors()
  2. {
  3.     return [
  4.         'timestamp' => [
  5.             'class' => TimestampBehavior::className(),
  6.             'attributes' => [
  7.                 ActiveRecord::EVENT_BEFORE_INSERT => 'creation_time',
  8.                 ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',
  9.             ],
  10.             'value' => function() { return date('U'); // unix timestamp },
  11.         ],
  12.     ];
  13. }
复制代码

2.2 保存时间戳除了插入或更新事件
你可能想要保存为自定义场景的时间戳。比方说你想更新 creation_time 特定的控制器动作。在这种情况下您可以触发您的特定属性的更新时间戳通过使用下面的方法:
  1. $model->touch('creation_time');
复制代码
3. 控制全球的格式
您可以配置 (yii\i18n\formatter)[http://www.yiiframework.com/doc-2.0/yii-i18n-formatter.html] 程序来控制你的全球显示日期的格式为您的语言环境。你可以设置在你的配置文件
  1. 'components' => [
  2.          ......
  3.         'formatter' => [
  4.             'class' => 'yii\i18n\Formatter',
  5.             'dateFormat' => 'php:d-M-Y',
  6.             'datetimeFormat' => 'php:d-M-Y H:i:s',
  7.             'timeFormat' => 'php:H:i:s',
  8.         ]
  9.         .....
  10. ]
复制代码
然后你可以在任何地方显示日期时间使用格式化程序指定的格式:
  1. echo Yii::t('app', 'Today is {0, date}', $yourTimeStampAttr);
复制代码
4. 轻而易举地将任何属性格式保存到数据库之前
如果您不希望使用扩展# 1所提示,您可以创建自己的全球格式保存。只是创建一个 helper 类如下:
  1. class Setup {
  2.     const DATE_FORMAT = 'php:Y-m-d';
  3.     const DATETIME_FORMAT = 'php:Y-m-d H:i:s';
  4.     const TIME_FORMAT = 'php:H:i:s';

  5.     public static function convert($dateStr, $type='date', $format = null) {
  6.         if ($type === 'datetime') {
  7.               $fmt = ($format == null) ? self::DATETIME_FORMAT : $format;
  8.         }
  9.         elseif ($type === 'time') {
  10.               $fmt = ($format == null) ? self::TIME_FORMAT : $format;
  11.         }
  12.         else {
  13.               $fmt = ($format == null) ? self::DATE_FORMAT : $format;
  14.         }
  15.         return Yii::$app->formatter->asDate($dateStr, $fmt);
  16.     }
  17. }
复制代码
然后其他地方(如控制器/模型)可以访问这个函数将任意输入日期/时间字符串保存到数据库。
  1. $model->dateAttr = Setup::convert($model->dateAttr);
  2. $model->datetimeAttr = Setup::convert($model->datetimeAttr, 'datetime');
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|PHPIN.NET ( 冀ICP备12000898号-14 )|网站地图

GMT+8, 2024-9-8 10:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表