PHP+MYSQL入门实践 日期时间
如果发现时间慢 8 小时,需要先设置一下时区
1. date_default_timezone_set(timezoneId) 函数设置脚步中日期时间函数的默认时区
2. 参数 timezoneId 是时区标识符 "Etc/GMT-8" 或 "Asia/Shanghai" 都可以
3. 成功时返回 true,失败时返回 false
date_default_timezone_set('Etc/GMT-8'); date_default_timezone_set('Asia/Shanghai');
课程时间以及 PHP 版本
2004-11-04 01:36:29
PHP/5.0.1
一、时钟
date () 时间日期函数
time() 时间戳
getDate(timestamp) 根据时间戳,返回一个时间日期的数组
strftime("格式字符串", timestamp) 返回格式化的时间字符串
mktime(hour, minute, second, month, day, year) 日期转事件戳,参数顺序 时 分 秒 月 日 年
1、时间日期
date() 函数
date_default_timezone_set('Etc/GMT-8'); $hour = date('h'); // 获取小时,大写H获取24制小时 $minute = date('i'); // 获取分钟 $second = date('s'); // 获取分钟 echo '现在时间 '. $hour . ':' . $minute . ':' .$second; // 现在时间 09:28:35
直接格式化我们想要的字符串格式,小写的 y 显示25,小写h是12小时进制
date_default_timezone_set('Etc/GMT-8'); $date = date("Y年m月d日 H时i分s秒"); print $date; // 2025年08月12日 09时54分14秒
相关参数
a - "am" 或是 "pm"
A - "AM" 或是 "PM"
d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
D - 星期几,三个英文字母; 如: "Fri"
F - 月份,英文全名; 如: "January"
h - 12 小时制的小时; 如: "01" 至 "12"
H - 24 小时制的小时; 如: "00" 至 "23"
g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
G - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
i - 分钟; 如: "00" 至 "59"
j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
l - 星期几,英文全名; 如: "Friday"
m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
M - 月份,三个英文字母; 如: "Jan"
s - 秒; 如: "00" 至 "59"
S - 字尾加英文序数,二个英文字母; 如: "th","nd"
t - 指定月份的天数; 如: "28" 至 "31"
U - 总秒数
w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
Y - 年,四位数字; 如: "1999"
y - 年,二位数字; 如: "99"
z - 一年中的第几天; 如: "0" 至 "365"
https://cloud.tencent.com/developer/article/1146028
小示例练习,静态时钟
<?php date_default_timezone_set('Etc/GMT-8'); header("Content-type: image/png"); // 作为图片输出 // 获取小时和分钟 $hour = date('h'); $min = date('i'); // 定义pi值 $pi = 3.14159; // 计算图形化时钟和分针所在的位置 $th = (30*$hour+0.5*$min) * (2*$pi/360); $tm = (6*$min) * (2*$pi/360); // 绘图 $image = imagecreate(200, 200); // 创建空白图像(或imagecreatetruecolor()) $colorbk = imagecolorallocate($image, 200, 200, 200); // 设置背景色 $color = imagecolorallocate($image, 255, 0, 0); // 设置前景色 $colorY = imagecolorallocate($image, 255, 0, 255); // 设置字体颜色 $colorGreen = imagecolorallocate($image, 0, 255, 0); // 设置表盘边框颜色 $colorBlue = imagecolorallocate($image, 0, 0, 255); // 设置表盘颜色 imagefill($image, 0, 0, $colorbk); // 用背景色填充图像 // 绘制表盘12个刻度 for($i=0;$i<12;$i++){ $a = $i*$pi/6; $x=100+sin($a)*100; $y=100-cos($a)*100; /** * 每一个刻度画一个小圆,画圆弧的函数imagearc * int imagearc(resource image, int cx, int cy, int w, int h, int s, int e, int color) * cx, cy 所画圆的中心点,如果 0, 0 是左上角 * h, w 是圆的宽高 * s, e 起始和结束,从0位于三点钟的位置,以逆时针方向画一个圆 */ // imagearc($image, $x, $y, 5, 5, 0, 360, $color); /** * 在图上写字符串 */ imagestring($image, 4, $x, $y, $i, $color); } /** * 画表边缘的圆圈 * 画布是200*200,中心点坐标是100, 100 * 画一个200,200的圈 */ imagearc($image, 100, 100, 200, 200, 0, 360, $colorGreen); // 填充表盘颜色,从中心点100, 100填充 // imagefill($image, 100, 100, $colorBlue); // 画中心点的圆 imagearc($image, 100, 100, 10, 10, 0, 360, $color); imagefill($image, 100, 100, $color); // 画线 $x_h = 100+sin($th)*60; $y_h = 100-cos($th)*60; $x_m = 100+sin($tm)*80; $y_m = 100-cos($tm)*80; imageline($image, 100, 100, $x_h, $y_h, $color); imageline($image, 100, 100, $x_m, $y_m, $color); imagepng($image); // 显示图像 imageDestroy($image); // 释放图像占用的资源 ?>
比如计算8点46分,时分和分针所在的位置
计算时钟的孤度
1. 表盘一周是12小时,360/12=30 既每隔一小时占30度,8点种角度是30*8=240度
角度换算成孤度是 30*2*π/360(360*2π在除360)
2. 60分钟=1小时,1小时时钟走30度,30度/60=0.5 每分钟时针要走0.5度
时钟孤度的公式
$th = (30*$hou+0.5*$min) * (2*$pi/360)
30*$hou 8小时乘30度=240度
每分钟0.5度乘46分钟=23度
240+23=时钟是263度
然后263*(2*$pi/360) = 孤度
秒钟弧度
表盘一周是60分钟,360/60=6度,既一分钟分针走6度
$tm = (6*$min) * (2*$pi/360)
2、时间戳
Timestamp 时间戳在 Unix 下广泛使用,返回从1970年1月1日0时起一共的秒数,这是一个非常庞大的数字
time()
该函数返回一个整数
echo time(); // 1755000454
date('字符串', 时间戳)
用 date() 函数把时间戳转换成容易阅读的格式
echo date('h i s a <p>', 1755000454); // 08 07 34 pm echo date('H h i l d F', time()); // 20 08 07 Tuesday 12 August
格式化时间
echo date('Y-n-d H:i:s', time()); // 2025-8-14 15:04:55
strftime("格式字符串", 时间戳)
返回格式化的时间字符串,如果没有填时间戳返回当前本地时间。该函数跟 date() 函数没有什么不同,加上 % 模仿 c 语言的格式转换
date_default_timezone_set('Etc/GMT-8'); echo strftime('%H %M %A %d %b <br>'); // 10 45 Thursday 14 Aug echo strftime('%H : %M : %S', time()); // 10 : 45 : 57
相关参数
%H 24制小时的十进制小时,范围00~23
%M 十进制分钟
%S 秒
%A 当前区域星期几的全称
%d 月份中的第几天,十进制范围01~31
%b 当前区域月份简写
array getDate([int timestamp])
根据传入的时间戳,返回一个出包含日期信息的数组,数组里面是一连串的日期信息,如果没有传时间戳返回本地时间
$today = getDate(); // 没有传时间戳返回本地时间 print_r($today); echo $today['weekday']; // Tuesday
数组中的信息,可以很容易的获取我们需要的日期部分,几点,几分,几秒...
键名 | 说明 | 返回值 |
seconds | 秒 | 0~59 |
minutes | 分钟 | 0~59 |
hours | 小时 | 0~23 |
mday | 月份中的第几天 | 1~31 |
wday | 星期中的第几天 | 0~6, 0表示星期日 |
mon | 月份 | 1~12 |
year | 四位数的年 | 2022 |
yday | 一年中的第几天 | 0~366 |
weekday | 星期几的完整英文 | Sunday到Saturday |
month | 完整英文月份 | January到December |
3、日期转 Unix 时间戳
int mktime(int hour, int minute, int second, int month, int day, int year, int is_dst)
参数顺序分别是 时 分 秒 月 日 年
is_dst 最后一个参数是夏令时(Daylight Saving Time:DST)可选的
比如,2025年8月14日 13:58:24 转换为时间戳(也需要先设置时区)
date_default_timezone_set('Etc/GMT-8'); echo mktime(13, 58, 24, 8, 14, 2025); // 1755151104
使用 explode() 方法把字符串分解成数组,然后注意参数的顺序,13点钟开始、25分、24秒、月、日、年
date_default_timezone_set('Etc/GMT-8'); $access_date = "2025/08/14"; $date_elements = explode("/", $access_date); echo mktime(13, 58, 24, $date_elements[1], $date_elements[2], $date_elements[0]); // 1755151104
验证一下,把转换的时间戳格式化输出
date_default_timezone_set('Etc/GMT-8'); echo date("Y-n-d H:i:s", 1755151104); // 2025-8-14 13:58:24
增加一点复杂度
date_default_timezone_set('Etc/GMT-8'); $date_time_string = "2025/08/14 2:45:21 PM"; $elements = explode(" ", $date_time_string); $date_elements = explode("/", $elements[0]); $time_elements = explode(":", $elements[1]); if($elements[2] == "PM"){ // 如果是下午,则将时间加12小时得到24小时制时间 $time_elements[0] += 12; } // 时 分 秒 月 日 年 echo mktime($time_elements[0], $time_elements[1], $time_elements[2], $date_elements[1], $date_elements[2], $date_elements[0]); // 1755153921
$time_elements[0] += 12
+= 运算符,将 $time_elements[0] 的值本身加上 12,在放到该值所在的内存单元里面去
验证一下,将上面的时间戳转回时间
$date_arr = getDate(1755153921); echo $date_arr['year'].'年<br/>'; echo $date_arr['mon'].'月<br/>'; echo $date_arr['mday'].'日<br/>'; echo $date_arr['hours'].'时<br/>'; echo $date_arr['minutes'].'分<br/>'; echo $date_arr['seconds'].'秒';
4、小练习
通过 Unix 时间戳,获取最后一次玩游戏的过去了多少时间
date_default_timezone_set('Etc/GMT-8'); $timestamp = time(); echo strftime("%Hh %M %A %d %b", $timestamp).'<br/>'; // 13 50 Wednesday 13 Aug // getdate函数获取时间戳里面信息 $date_time_array = getdate($timestamp); $hours = $date_time_array['hours']; $minutes = $date_time_array['minutes']; $seconds = $date_time_array['seconds']; $month = $date_time_array['mon']; $day = $date_time_array['mday']; $year = $date_time_array['year']; // 加上19个小时后,mktime函数重新产生时间戳(时 分 秒 月 日 年) $timestamp = mktime($hours+19, $minutes, $seconds, $month, $day, $year); echo strftime("%Hh %M %A %d %b", $timestamp); // 08 50 Thursday 14 Aug echo '<br/>~E after adding 19 hours'
页面上的动态时钟
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>动态时钟</title> <meta http-equiv="Refresh" content=1> <!-- 每一秒重定向到本页一次 --> </head> <body> <?php date_default_timezone_set('Asia/Shanghai'); $Today = date("Y年 m月 d日 F l"); $time = date("H : i : s"); ?> <p> 现在日期: <?php echo $Today; ?> </p> <p> 现在时间: <?php echo $time; ?> </p> </body> </html>