Go to comments

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


数组中的信息,可以很容易的获取我们需要的日期部分,几点,几分,几秒...

键名说明返回值
seconds0~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>



Leave a comment 0 Comments.

Leave a Reply

换一张