今天上午同学问了我一个 mysql 数据库存储时间的问题,就忽然想起要不就总结一下 php 和 mysql 中的日期和时间吧。 我们在一个项目中往往对同一个时间会使用多种方式表达,比如我曾经在 mysql 数据库中是用 int(11)存储 unix 时间戳,查询出来后再用 date()函数进行格式化,或者还有‘Tuesday 18th March 2013’、‘03/18/2013’(美国格式),‘18/03/2013’(欧洲格式),‘20130318’等等。这么多的时间格式我们怎么选择呢,如何显示冲数据库获取的文章列表,并按照日期排序?如果希望呈现更复杂的内容,例如在线日历,应该怎么做? 不过在此之前我们要说明一下,我们整个地球有很多的时区,不是说我们在哪儿使用服务器,就会显示哪个时区的时间,如果我们不进行设置的话,默认的是 0 时区的时间,对于我们来说会相差 8 个小时。不过呢,我们可以使用 关于 UNIX 时间戳:什么是 unix 是时间戳,unix 时间戳就是从某一个标准时间点(1970/1/1 00:00:00)到某一点所经过的秒数,比如现在(2013/04/11 15:20:47)的时间戳就是 1365664847。php 中有很多对时间戳进行操作的函数,比如 time()、 mktime()、 date()、 strtotime()、 microtime()等等。 对于 time()函数:int time ( void ),返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数(unix 时间戳)。我们可以看到,time()函数没有参数,返回的就是当前时间的 unix 是时间戳。 让我们尝试一下上面的几个函数,看看都能输出些什么。 是不是发现 strtotime 很强大啊,他能将一些可以判定的时间字符串转换为时间戳。 有没有一种想要做一个简单的日历的冲动呢?让我们来试试吧。我们就做下面的这种效果。 首先我们的准备工作有: 我们来一步步的写,定义一个数组$calender_data 来存储数组中所有的数据,包括空的格子。 获取当月的第一天的时间戳,同时生成上一月、下一月、上一年和下一年的时间戳: range() 函数创建并返回一个包含指定范围的元素的数组。 生成上一月、下一月、上一年和下一年的链接: 生成一周的星期简称: 将一个月前面的空格,天和最后的空格追加到数组中: 将数组填充到表格中: 好的,此时整个日历就完成了。date_default_timezone_get()
获取服务器所在的时区,可以使用 date_default_timezone_set(string $timezone_identifier)设置时区,比如 date_default_timezone_set("Asia/Shanghai");,那么此时服务器的时区就改成了东八区了。
//date_default_timezone_set("Asia/Shanghai");
echo 'date_default_timezone:'.date_default_timezone_get().'
';
echo 'time():'.time().'
';
echo 'date("Y/m/d H:i:s"):'.date('Y/m/d H:i:s').'
';
echo 'date("Y/m/d H:i:s", 1365665148)'.date("Y/m/d H:i:s", 1365665148).'
';
echo 'microtime():'.microtime().'
';
echo 'microtime(true):'.microtime(true).'
';
echo 'mktime(14, 43, 0, 4, 11, 2013):'.mktime(14, 43, 0, 4, 11, 2013).'
';
echo 'mktime(14, 43, 0, 4):'.mktime(14, 43, 0, 4).'
';
echo 'strtotime("April 11th 2013 14:43:00"):'.strtotime('April 11th 2013 14:43:00').'
';
echo 'strtotime("April"):'.strtotime('April').'
';
echo 'strtotime("+1 day"):'.date("Y/m/d l H:i:s", strtotime('+1 day')).'
';
echo 'strtotime("-1 month"):'.date("Y/m/d l H:i:s", strtotime('-1 month')).'
';
echo 'strtotime("-2 year"):'.date("Y/m/d l H:i:s", strtotime('-2 year')).'
';
echo 'strtotime("next friday"):'.date("Y/m/d l H:i:s", strtotime('next friday')).'
';
echo 'strtotime("last saturday"):'.date("Y/m/d l H:i:s", strtotime('last saturday')).'
';
$g = $_REQUEST;
$year = isset($g['year'])?$g['year']:date("Y"); //获取$year
$month = isset($g['month'])?$g['month']:date("F"); //获取$month
$start_day = strtotime("{$month} 1 {$year}"); //$year $month的第一天的时间戳
$day_num = date('t', $start_day); //一个月的天数
$date_range = range(1, $day_num); //
$pre_month = strtotime("-1 month", $start_day); //上一月的第一天的时间戳
$next_month = strtotime("+1 month", $start_day); //下一个月的第一天的时间戳
$pre_year = strtotime("-1 year", $start_day); //
$next_year = strtotime("+1 year", $start_day);
define(EMP, ' ');
$html = "?year=%s&month=%s'>%s";
$calender_data = array();
$calender_data[] = sprintf($html, date('Y', $pre_month), $month, date('Y', $pre_year));
$calender_data[] = EMP;
$calender_data[] = EMP;
$calender_data[] = $year;
$calender_data[] = EMP;
$calender_data[] = EMP;
$calender_data[] = sprintf($html, date('Y', $next_year), $month, date('Y', $next_year));
$calender_data[] = sprintf($html, date('Y', $pre_month), date('F', $pre_month), date('M', $pre_month));
$calender_data[] = EMP;
$calender_data[] = EMP;
$calender_data[] = $month;
$calender_data[] = EMP;
$calender_data[] = EMP;
$calender_data[] = sprintf($html, date('Y', $next_month), date('F', $next_month), date('M', $next_month));
$calender_data[] = 'Sun';
$calender_data[] = 'Mon';
$calender_data[] = 'Tue';
$calender_data[] = 'Wed';
$calender_data[] = 'Thu';
$calender_data[] = 'Fri';
$calender_data[] = 'Sat';
$start_blank = date('N', $start_day)%7;
for($i=0; $i<$start_blank; $i++){
$calender_data[] = EMP;
}
foreach($date_range as $v){
$calender_data[] = $v;
}
$end_blank = (7-($day_num+$start_blank)%7)%7;
for($i=0; $i<$end_blank; $i++){
$calender_data[] = EMP;
}
$h = '
{$calender_data[$i]} ";
if(($i+1)%7==0){
$h .= "";
}
}
$h .= '';
echo $h;
版权属于:
加速器之家
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论