laravel5 timestamp

本文同时发表在本人的博客http://blog.cozyou.com/articles/30

提纲:
-timestamp与Timestamp类型
-mysql中的时间数据类型
-php中的时间函数
-Laravel5 中的timestamp


问题的引出:
laravel5选择carbon做时间库函数,同时在migration中有timstamps这个函数。有如下问题:
1.carbon相关属性?与timestamp联系?
2.在做处理时,timestamp应该如何与UNIX时间戳(int型)进行转换,或者计算时直接用timestamp的相关函数进行计算?
3.时区问题?


timestamp与Timestamp类型

想要解读这三个问题,首先我们要了解时间戳的概念。
在程序员的世界里,时间戳(timestamp)通常指Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
随着类Unix操作系统的普及,Unix时间戳在程序员的世界中逐渐成为主流。
它只是一个单纯的从某个时间点开始的整数,仅此而已。

而在各大流派中,比如某操作系统中,或者某数据库中,都有一些对UNIX时间戳的计算函数,比如:
php中获取时间戳的方法是:time();Date();
Linux中获取时间戳的方法是:date +%s

一定要注意的是:这里的timestamp就是一种约定方式,一个数字,一个定义。而各大流派中的Timestamp类型与这个意义是不一样的,它们封装了一些其他的特性,别搞混了!!!!

Mysql中的时间数据类型

由于与Mysql数据库打交道比较多,所以以这个流派为例说明:

在mysql中,常用的三种表示时间的类型包括:timestamp和datetime,int。内部存储都是整数,只不过datetime和timestamp会显示为可读字符串,默认均位19位的字符串,如’YYYY-MM-DD HH:MM:SS’,存储空间上int和timestamp都是4字节,datetime是8字节,datetime范围为1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,timestamp范围为1970-01-01 08:00:01到2038-01-19 11:14:07。

按道理说,由于可以用int型表示时间,负数即可表示1970年以前的时间,不过在mysql一些版本的一些函数中,处理负的时间戳可能会有坑,比如这里:http://blog.unlink.link/sql/mysql_before_1970_minus_unixtime.html

人们通常说mysql中的timestamp类型是与时区有关的,而datetime与时区无关。这是因为timestamp类型的值以UTC格式保存,It implicitly stores data in GMT time zone.存储时对当前的时区进行转换,检索时再转换回当前的时区;而datetime存进去是啥就是啥。比如如果一个时间t1以timestamp方式存储,则以东8区读出来是9点,以东9区读出来则是10点;而datetime不管这些,你在东8区看着是9点,东9区也一样是9点。

在一些特殊功能的数据结构选型时,要注意到这个时区问题。通常,如果记录事件发生时间等值时最好用timestamp,这样全球每个人都能知道真实的时间。而记录另一些值,比如存储一个人的生日时,最好用datetime类型,想象一下一个人在北京查自己的出生在几点与在华盛顿查询结果不同的感受。

问题来了,我可以将一个表示unix timestamp的整数直接存入mysql timestamp类型中吗,以及在不同时区从timestamp取到的整数值是一定的吗?
我们用integer与Timestamp两种类型存取时间戳的优缺点都有什么,在这里如下的stackoverflow帖子中,做了一些分析:http://stackoverflow.com/questions/7029127/using-mysqls-timestamp-vs-storing-timestamps-directly
mysql中的UNIX_TIMESTAMP等相关函数:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

php中时间的相关函数:

$int=time();//int
$date=('Y-m-d h:i:s',$int);//string

$test->dob = strtotime('September 13, 1922');
echo $test->dob; // 1922-09-13 00:00:00

mysql中的相关函数

mysql> SELECT UNIX_TIMESTAMP();
        -> 1447431666
mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');
        -> 1447431619
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 03:00:00') |
+---------------------------------------+
|                            1111885200 |
+---------------------------------------+
mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 02:00:00') |
+---------------------------------------+
|                            1111885200 |
+---------------------------------------+
mysql> SELECT FROM_UNIXTIME(1111885200);
+---------------------------+
| FROM_UNIXTIME(1111885200) |
+---------------------------+
| 2005-03-27 03:00:00       |
+---------------------------+

laravel中的timestamp

Model类相关

如:关闭创建时间 与 更新时间 的自动维护(protected timestampsprotected timestamps = false;
注意 在默认情况下需要在表中定义 updated_at 和 created_at 字段。如果不希望它们被自动维护,请在模型中设置 $timestamps 属性为 false。

Migration相关:

日期 时间
$table->date('created_at');     // DATE      类型
$table->dateTime('created_at'); // DATETIME  类型
$table->time('sunrise');        // TIME      类型
$table->timestamp('added_on');  // TIMESTAMP 类型
系统辅助
$table->timestamps();  // 添加 created_at 和 updated_at 列 
$table->softDeletes(); // 添加 deleted_at 列用于软删除

Carbon

The Carbon class is inherited from the PHP DateTime class.
Carbon的具体函数见下网址:http://carbon.nesbot.com/docs/

laravel默认支持Carbon库来处理时间:

$article= App\Article::find(3);
$t_carbon=new Carbon\Carbon($article->created_at);
$t_int=$t_carbon->timestamp;
$t_str=date('Y-m-d h:i:s',$t_int);

在tinker中实验:

echo Carbon::createFromFormat('Y-m-d H', '1975-05-21 22')->toDateTimeString(); // 1975-05-21 22:00:00
echo Carbon::createFromTimestamp(-1)->toDateTimeString();                        // 1969-12-31 18:59:59
echo Carbon::createFromTimestamp(-1, 'Europe/London')->toDateTimeString();       // 1970-01-01 00:59:59
echo Carbon::createFromTimeStampUTC(-1)->toDateTimeString();                     // 1969-12-31 23:59:59

Carbon::createFromDate(2012, 1, 1)->addDay();
Carbon::createFromDate(2012, 1, 1)->subDay();

$first = Carbon::create(2012, 9, 5, 1);
$second = Carbon::create(2012, 9, 5, 5);
Carbon::create(2012, 9, 5, 3)->between($first, $second);

Eloquent相关

 "startTime" => "2015-07-08 00:00:00"
  "endTime" => "2015-07-29 11:32:48"
  User::whereBetween('created_at', [Input::get('startTime'), Input::get('endTime')])->get();
  ->whereRaw('user.created_at >= startTime')
  ->whereRaw('user.created_at <= endTime');

详细的Eloquent文档见https://laravel.tw/docs/5.0/eloquent
http://laravel-china.org/docs/5.0/eloquent

相关的有:
Eloquent 聚合查詢

$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user)
{
    var_dump($user->name);
}

Eloquent 聚合查询

当然,您也可以使用查询构造器的聚合查询方法。

$count = User::where(‘votes’, ‘>’, 100)->count();
如果没办法使用流畅接口产生出查询语句,也可以使用 whereRaw 方法:

$users = User::whereRaw('age > ? and votes = 100', [25])->get();

拆分查询

如果您要处理非常多(数千条)Eloquent 查询结果,使用 chunk 方法可以让您顺利工作而不会消耗大量内存:

User::chunk(200, function( $users)
{
    foreach ($users as $user)
    {

    }
});

传到方法里的第一个参数表示每次「拆分」要取出的数据数量。第二个参数的闭合函数会在每次取出数据时被调用。

转timestamp的代码:

public function setPublishedAt($value)
{
    $this->attributes['published_at'] = strtotime($value);
}
to convert to timestamp

$model -> setPublishedAt('2015-08-26'); // 1440572400

你可能感兴趣的:(laravel相关)