在开发网站时,您通常需要使用日期和时间。 例如,您可能需要在帖子上显示上次修改日期,或提及读者多久之前发表评论。 您可能还需要显示倒计时,直到发生特殊事件为止。
幸运的是,PHP附带了一些内置的日期和时间函数,这些函数将帮助我们更轻松地完成所有这些工作。
本教程将教您如何使用PHP格式化当前日期和时间。 您还将学习如何从日期字符串获取时间戳,以及如何添加和减去不同的日期。
以字符串格式获取日期和时间
date($format, $timestamp)
是PHP中最常用的日期和时间函数之一。 它以日期的期望输出格式作为第一个参数,以整数作为时间戳值,需要将其转换为给定的日期格式。 第二个参数是可选的,省略该参数将根据$format
的值以字符串格式给出当前日期和时间。
$format
参数接受一系列字符作为有效值。 其中一些字符具有简单的含义: Y
给出年份的全数字表示形式,为4位数字(2018),而y
仅给出当前年份的后两位数字(18)。 同样, H
会以24小时格式带给您小时,前导零,而h
会以12小时格式给您带来小时,前导零。
以下是一些最常见的日期格式字符及其值。
字符 | 含义 | 例 |
---|---|---|
d | 月份中的前导零 | 03或17 |
j | 没有前导零的月份中的一天 | 3或17 |
D | 星期几(三字母缩写) | 周一 |
l | 一整天 | 星期一 |
m | 一个月,前导零 | 09或12 |
n | 一个月,没有前导零 | 9或12 |
M | 一个月的三字母缩写 | 九月 |
F | 整月 | 九月 |
y | 两位数年份 | 18岁 |
Y | 全年 | 2018年 |
还有许多其他特殊字符可以指定date()
函数的输出。 最好查阅date()
函数文档中的格式字符表 ,以获取有关特殊情况的更多信息。
现在让我们来看一些有关date()
函数的实际例子。 我们可以使用它来获取当前年份,当前月份,当前小时等,也可以使用它来获取完整的日期字符串。
<?php
// Output — 2018
echo date('Y');
// Output — September 2018
echo date('F Y');
// Output — 13 September, 2018
echo date('d F, Y');
// Output — 13 September, 2018 (Thursday)
echo date('d F, Y (l)');
您也可以使用date()
函数输出时间。 以下是一些最常用的时间格式字符:
字符 | 含义 | 例 |
---|---|---|
g | 12小时制的小时数,前导零 | 1或12 |
h | 12小时格式的小时,前导零 | 01或12 |
G | 24小时制格式的小时,不带前导零 | 1或13 |
H | 24小时格式的小时,前导零 | 01或13 |
a | 小写的上午/下午 | 上午 |
A | 大写的上午/下午 | 上午 |
i | 分钟,前导零 | 09或15 |
s | 前导零秒 | 05或30 |
这是输出格式化时间字符串的一些示例。
// Output — 11:03:37 AM
echo date('h:i:s A');
// Output — Thursday, 11:04:09 AM
echo date('l, h:i:s A');
// Output — 13 September 2018, 11:05:00 AM
echo date('d F Y, h:i:s A');
?>
如果要在日期字符串中使用这些特殊字符,请转义这些特殊字符,这一点也很重要。
<?php
// Output — CEST201813am18 1115 Thursday.
echo date('Today is l.');
// Output — Today is Thursday.
echo date('\T\o\d\a\y \i\s l.');
// Output — Today is Thursday.
echo 'Today is '.date('l.');
?>
获取Unix时间戳
有时,您将需要获取PHP中当前Unix时间戳的值。 借助time()
函数,这非常容易。 它返回一个整数值,该值描述自格林尼治标准时间1970年1月1日午夜(00:00:00)开始经过的毫秒数。
您也可以使用此功能来回切换。 为此,您所需要做的就是从time()
的当前值中减去正确的秒数,然后将结果值更改为所需的日期字符串。 这是两个示例:
<?php
$ten_days_later = time() + 10*60*60*24;
// Output — It will be Sunday 10 days later.
echo 'It will be '.date('l', $ten_days_later).' 10 days later.';
$ten_days_ago = time() - 10*60*60*24;
// Output — It was Monday 10 days ago.
echo 'It was '.date('l', $ten_days_ago).' 10 days ago.';
?>
您应该记住的重要一件事是time()
返回的时间戳值与time()
区无关,并且获取自1970年1月1日UTC以来的秒数。 这意味着在特定时间点,此函数将在美国,欧洲,印度或日本返回相同的值。
获取特定日期时间戳的另一种方法是使用mktime($hour, $minute, $second, $month, $day, $year)
函数。 当省略所有参数时,此函数仅使用当前本地日期和时间来计算时间戳记值。 此函数也可以与date()
一起使用,以生成有用的日期和时间字符串。
<?php
$some_time = mktime(1, 1, 1, 12, 3, 1994);
// Output — It was Saturday on 03 December, 1994.
echo 'It was '.date('l', $some_time).' on '.date('d F, Y', $some_time).'.';
?>
基本上, time()
可用于来回移动一段时间,而mktime()
在您想到mktime()
定时间点时很有用。
将Datetime字符串转换为时间戳
当您要将字符串格式的不同日期和时间值转换为时间戳strtotime($time, [$now = time()])
函数将非常有用。 该函数可以将几乎所有类型的日期时间字符串解析为时间戳。
您绝对应该检查有效的时间格式 , 日期格式 , 复合日期时间格式和相对日期时间格式 。
使用相对的日期时间格式,此函数可以轻松地将常用字符串转换为有效的时间戳值。 以下示例应清楚说明:
<?php
$some_time = strtotime("10 months 15 days 10 hours ago");
// Output — It was Sunday on 29 October, 2017 03:16:46.
echo 'It was '.date('l', $some_time).' on '.date('d F, Y h:i:s', $some_time).'.';
$some_time = strtotime("next month");
// Output — It is Saturday on 13 October, 2018 01:18:05.
echo 'It is '.date('l', $some_time).' on '.date('d F, Y h:i:s', $some_time).'.';
$some_time = strtotime("third monday");
// Output — Date on the third monday from now will be 01 October, 2018.
echo 'Date on the third monday from now will be '.date('d F, Y', $some_time).'.';
$some_time = strtotime("last day of November 2021");
// Output — Last day of November 2021 will be Tuesday.
echo 'Last day of November 2021 will be '.date('l', $some_time).'.';
?>
添加,减去和比较日期
可以在日期之间添加或减去特定的时间段。 这可以借助date_add()
和date_sub()
函数来完成。 您还可以使用date_diff()
函数减去两个日期,并以年,月,日或其他方式输出它们之间的差。
通常,使用DateTime
类以面向对象的方式执行与日期和时间相关的任何此类算术都比较容易,而不是按程序进行。 我们将在此处尝试这两种样式,您可以选择最喜欢的样式。
<?php
$present = date_create('now');
$future = date_create('last day of January 2024');
$interval = date_diff($present, $future);
// Output — 05 years, 04 months and 17 days
echo $interval->format('%Y years, %M months and %d days');
$present = new DateTime('now');
$future = new DateTime('last day of January 2024');
$interval = $present->diff($future);
// Output — 05 years, 04 months and 17 days
echo $interval->format('%Y years, %M months and %d days');
?>
当使用DateTime::diff()
所述DateTime
在其上的对象diff()
被调用的方法被从减去DateTime
,其被传递给对象diff()
方法。 在编写过程样式代码时,将从第二个日期参数中减去第一个日期参数。
函数和方法都返回一个DateInterval()
对象,该对象表示两个日期之间的差。 可以使用format()
方法文档中列出的所有字符来格式化此间隔,以提供特定的输出。
减去或增加时间间隔后,面向对象样式和过程样式之间的区别变得更加明显。
您可以使用DateTime()
构造函数实例化一个新的DateTime
对象。 同样,您可以使用DateInterval()
构造函数实例化DateInterval
对象。 它接受一个字符串作为其参数。 间隔字符串以P
开头,表示周期。 之后,您可以使用整数值和分配给特定时段的字符来指定每个时段。 您应该查看DateInterval
文档以获取更多详细信息。
这是一个示例,说明在PHP中添加或减去日期和时间有多么容易。
<?php
$now = new DateTime('now');
$the_interval = new DateInterval('P20Y5M20D');
$now->add($the_interval);
// Output — It will be Saturday, 05 March, 2039 after 20 years, 05 months and 20 days from today.
echo 'It will be '.$now->format('l, d F, Y').' after '.$the_interval->format("%Y years, %M months and %d days").' from today.';
$now = date_create('now');
$the_interval = date_interval_create_from_date_string('20 years 05 months 20 days');
date_add($now, $the_interval);
// Output — It will be Saturday, 05 March, 2039 after 20 years, 05 months and 20 days from today.
echo 'It will be '.$now->format('l, d F, Y').' after '.$the_interval->format("%Y years, %M months and %d days").' from today.';
?>
您还可以使用比较运算符在PHP中比较日期。 这可以时不时地派上用场。 让我们使用比较运算符和其他DateTime
方法创建一个圣诞节计数器。
<?php
$now = new DateTime('today');
$christmas = new DateTime('25 December 2018');
while($now > $christmas) {
$christmas->add(new DateInterval('P1Y'));
}
if($now < $christmas) {
$interval = $now->diff($christmas);
echo $interval->format('%a days').' until Christmas!';
}
if($now == $christmas) {
echo 'Merry Christmas :)';
}
// Output — 103 days until Christmas!
?>
我们首先创建两个DateTime
对象来存储当前时间和今年圣诞节的日期。 之后,我们运行一个while
循环,以继续向2018年圣诞节日期添加1年,直到当前日期小于圣诞节日期为止。 当代码在2024年1月18日运行时,这将很有帮助。while循环将使圣诞节日期递增,只要它小于运行此脚本时的当前日期即可。
我们的圣诞节柜台现在可以正常使用数十年了。
最后的想法
在本教程中,我们学习了如何使用date()
函数以所需的格式输出当前日期和时间。 我们还看到date()
也可以仅用于获取当前的年份,月份等。 之后,我们学习了如何获取当前时间戳或将有效的DateTime
字符串转换为时间戳。 最后,我们学习了如何从不同的日期增加或减少一段时间。
我试图在这里介绍关键的DateTime
函数和方法。 您绝对应该看一下文档,以了解本教程未涵盖的功能。 如果您有任何疑问,请随时在评论中让我知道。
翻译自: https://code.tutsplus.com/tutorials/working-with-date-and-time-in-php--cms-31768