PHP 函数与日期

第一章:函数

 1.1 定义函数

PHP 函数参数传递的四种方式

在调用函数时,需要向函数传递参数,被传入函数的参数称为实参,而函数定义的参数称为形参。而向函数传递参数的方式有四种,分别是值传递、引用传递、默认参数和可变长度参数。

  1. 值传递 与  引用传递

<?php
2    function swap($a, $b){
3        echo '函数内,交换前 $a = '.$a.', $b = '.$b."\n";
4        $temp = $a;
5        $a = $b;
6        $b = $temp;
7        echo '函数内,交换后 $a = '.$a.', $b = '.$b."\n";
8    }
9    $x = 5;
10    $y = 7;
11    echo '函数外,交换前 $x = '.$x.', $y = '.$y."\n";
12    swap($x, $y);
13    echo '函数外,交换后 $x = '.$x.', $y = '.$y;
14?>

运行结果如下:

1函数外,交换前 $x = 5, $y = 7
2函数内,交换前 $a = 5, $b = 7
3函数内,交换后 $a = 7, $b = 5
4函数外,交换后 $x = 5, $y = 7

通过运行结果可以看到,在函数内,数值确实是交换了,而在函数外部,数值却没有变化。因此可以说,函数的值传递只是传递变量的副本。那么要是想让函数能够操作函数外实参的话,就需要使用引用传递的方式了。

参数的引用传递就是把实参的内存地址复制一份,然后传递给函数的形参,实参和形参都指向同一个内存地址,因此函数对形参的操作,会影响到函数外的实参。

按引用传递就是将实参的内存地址传递到函数的形参中。因此实参和形参指向的是同一个内存地址。这时在函数内部的所有操作都会影响到函数外实参的值。

2. 默认参数 与 可变长度参数

默认参数就是给函数的某个或多个形式参数指定一个默认的值,如果调用函数时不传入对应的值,那么函数就会使用这个默认值,这样可以避免调用时出现没有参数的错误,也可以使一些程序显得更加合理。如果传入对应的参数,就会替换这个默认值。

【示例】下面来定义一个具有多个默认参数的函数,如下所示:

1<?php
2    function add($a, $b=33, $c=57){
3        echo $a.' + '.$b.' + '.$c.' = '.($a+$b+$c)."\n";
4    }
5    add(11);
6    add(31, 22);
7    add(64, 9, 7);
8?>

运行结果如下:

111 + 33 + 57 = 101
231 + 22 + 57 = 110
364 + 9 + 7 = 80

函数的形式参数可使用  来表示函数可接受一个可变数量的参数,可变参数将会被当作一个数组传递给函数。示例如下:

<?php
2    function test(...$arr){
3        print_r($arr);
4    }
5    test(1, 2, 3, 4);
6    test(5, 6, 7, 8, 9, 10);
7?>
Array
2(
3  [0] => 1
4  [1] => 2
5  [2] => 3
6  [3] => 4
7)
8Array
9(
10  [0] => 5
11  [1] => 6
12  [2] => 7
13  [3] => 8
14  [4] => 9
15  [5] => 10
16)

1.2 PHP 声明参数类型

在 PHP 5 中已引入函数的参数类型声明,如果给定的值不是一个合法的参数类型,那么在 PHP 5 中会出现一个 Fatal error,在 PHP 7 中则会抛出一个 TypeError exception

在 PHP 7 中增加了参数可声明的类型种类,如表所示。

类型说明PHP 版本
class/interface name(类,接口)参数必须是指定类或接口的实例PHP 5.0.0
Array参数为数组类型PHP 5.1.0
Callable参数为有效的回调类型PHP 5.4.0
Bool参数为布尔型PHP 7.0.0
Float参数为浮点型PHP 7.0.0
Int参数为整型PHP 7.0.0
String参数为字符串PHP 7.0.0
class/interface name(类,接口)参数必须是指定类或接口的实例PHP 5.0.0
Array参数为数组类型PHP 5.1.0

第二章:PHP 时间和日期

1.1 PHP中的时区设置

[Date]
2; Defines the default timezone used by the date functions
3; http://php.net/date.timezone
4date.timezone = Asia/Shangha
  • Asia/Shanghai —— 上海
  • Asia/Chongqing —— 重庆
  • Asia/Urumqi —— 乌鲁木齐
  • Asia/Hong_Kong —— 香港
  • Asia/Macao —— 澳门
  • Asia/Taipei —— 台北
  • Asia/Singapore —— 新加坡
  • PRC —— 中国时区

1.2 使用 ini_set() 函数设置时区

<?php
2    ini_set('date.timezone', 'GMT');
3    echo '当前的格林尼治时间为:'.date('Y-m-d H:i:s',time())."\n";
4    ini_set('date.timezone', 'Asia/Urumqi');
5    echo '乌鲁木齐的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
6    ini_set('date.timezone', 'Asia/Shanghai');
7    echo '上海的当前时间为:'.date('Y-m-d H:i:s',time());
8?>

1.3  使用 date_default_timezone_set() 函数设置时区

date_default_timezone_set($timezone_identifier)
<?php
2    date_default_timezone_set('Asia/Urumqi');
3    echo '乌鲁木齐的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
4    date_default_timezone_set('Europe/Lisbon');
5    echo '葡萄牙的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
6    date_default_timezone_set('Asia/Shanghai');
7    echo '上海的当前时间为:'.date('Y-m-d H:i:s',time());
8?>

2.1 PHP 获取当前时间

1.gmmktime() 函数可取得 GMT 日期的 UNIX 时间戳。

使用示例如下:

1<?php
2echo gmmktime();  //没有设置参数, 则默认取得当前GMT时间
3echo gmmktime(0,45,3,7,7,2016);  //设置参数表示GMT时间2016年7月7日0点45分3秒
4?>

执行以上程序的打印结果为:

11467909956  1467852303

2.mktime()

mktime() 也可取得一个日期的 UNIX 时间戳。

该函数根据给出的参数返回 UNIX 时间戳。时间戳是一个长整数,包含了从 UNIX 纪元到给定时间的秒数。和 gmmktime() 函数一样,该函数的参数也可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。

使用示例如下:

1<?php
2echo mktime();  // 没有设置参数则默认取得当前GMT时间
3echo mktime(0,45,3,7,7,2016);  //设置参数表示GMT时间2016年7月7日0点45分3秒
4?>

执行以上程序的打印结果为:

11467910465 1467852303

3.microtime()

microtime() 可获得当前 UNIX 时间戳和微秒数。语法如下:

mixed microtime ([ bool $get_as_float ] )

如果设置 get_as_float 参数值为 truemicrotime() 将返回一个浮点数;若不带参数,则返回一个 “msec sec” 格式的字符串,其中 sec 是自 UNIX 纪元起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。

使用示例如下:

1<?php
2echo microtime();  //返回 msec sec 格式字符串表示时间
3echo "\n";
4echo microtime(true);  //返回一个浮点型字符串表示时间
5?>

执行以上程序的打印结果如下:

10.40474900 1467910862
21467910862.4048

4.time()

time() 函数可返回当前的 UNIX 时间戳。语法如下:

1int time ( void )

time() 函数的语法比较简单,使用示例如下:

1<?php
2echo time();
3?>

执行以上程序的打印结果为:

11467911104

5.get date()

getdate() 可取得日期时间信息。语法如下:

1array getdate ([ int $timestamp = time() ] )

2.2 PHP strtotime()与mktime():日期转时间戳

1、strtotime() 函数

使用 strtotime() 函数可以将任何字符串类型的日期/时间转换为 UNIX 时间戳,其语法格式如下:

strtotime($time [,$now = time()])

其中 $time 为表示时间/日期的字符串,例如“2020-01-01”;$now 为可选参数,用来计算返回值的时间戳。函数执行成功会返回指定的字符串,执行失败返回 FALSE

另外需要注意的是,如果使用两位数字表示年份的话,其中 0 ~ 69 表示 2000 ~ 2069,70 ~ 100 则表示 1970 ~ 2000。

2、mktime() 函数

除了 strtotime() 函数外,我们还可以使用 PHP 中的 mktime() 函数来获取指定日期的 UNIX 时间戳,该函数的语法格式如下:

mktime ([$hour = date("H") [, $minute = date("i") [, $second = date("s") [, $month = date("n") [, $day = date("j") [, $year = date("Y") [, $is_dst = -1 ]]]]]]])

参数说明如下:

  • $hour:表示一天中经过的小时数。如果 $hour 为负值,则表示前一天的适当时间;如果 $hour 大于 23,则表示第二天的适当时间。
  • $minute:表示一个小时内经过的分钟数。如果 $minute 为负值,则表示前一小时适当的分钟数;如果 $minute 大于 59,则表示下一小时中的适当分钟数。
  • $second:表示一分钟内经过的秒数。如果 $second 为负值,则表示前一分钟内的适当秒数;如果 $second 大于59,则表示下一分钟内的适当秒数。
  • $month:表示一年中经过的月份数,取值范围在 1 到 12 之间。如果 $month 小于 1(包括负值),则表示上一年的适当月份;如果 $month 大于 12,则表示下一年的适当月份。
  • $day:表示一个月中经过的天数,取值范围在 1 到 31 之间(取决于具体月份的天数)。如果 $day 小于 1(包括负值),则表示上个月的适当天数,比如 0 表示上个月的最后一天,-1 表示上个月的倒数第二天等等;如果 $day 大于本月的最大天数,则表示下个月的适当日期。
  • $year:表示具体的年份,可以是两位或四位数字,0 ~ 69 对应 2000 ~ 2069 年,70 ~ 100 对应 1970 ~ 2000年。在如今系统中普遍把 time_t 作为一个 32 位有符号整数的情况下,$year 的合法范围是 1901 到 2038 之间,不过此限制自 PHP5.1.0 起已被克服了。
  • $is_dst:本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制。不过本参数在 PHP5.1.0 中已被废弃,并在 PHP7.0.0 中移除。

2.3 PHP date():时间日期格式化

当时间和日期保存在计算机中的时候,可以使用 UNIX 时间戳作为标准格式。但是 UNIX 时间戳的可读性很差,所以有时我们需要把 UNIX 时间戳格式化为可读性更好的时间和日期,或者格式化为其它软件需要的格式。

在 PHP 中可以使用 date() 函数来格式化一个本地的时间或日期,该函数的语法格式如下:

date($format [,$timestamp])

参数说明如下:

  • $format:表示格式化后的时间格式,可以包含一些具有特殊含义的字符。
  • $timestamp:表示待格式化的时间戳,是一个可选参数,默认为当前时间。也可以理解为 $timestamp 的默认值为 time()

参数 $format 格式化字符串中可以识别的特殊字符如下表所示:

format 字符说明返回值例子
d月份中的第几天,使用两位的数字表示,不足两位时在前面补 001 到 31
D星期几的英文缩写(使用 3 个字母表示)Mon 到 Sun
l(“L”的小写字母)星期几的英文单词Sunday 到 Saturday
N根据 ISO-8601 标准格式,使用数字表示星期中的第几天(PHP5.1.0 新加)1(表示星期一)到 7(表示星期天)
S每月天数后面的英文后缀(使用 2 个字符表示)st、nd、rd 或者 th。可以和 j 一起使用
w使用数字表示星期中的第几天0(表示星期天)到 6(表示星期六)
z使用数字表示一年中的第几天0 到 365
W根据 ISO-8601 标准格式,使用数字表示年份中的第几周,每周从星期一开始,(PHP 4.1.0 新增)例如:42(当年的第 42 周)
F月份的英文单词,例如 January 或者 JuneJanuary 到 December
m使用两位的数字表示当前月份01 到 12
M月份的英文缩写Jan 到 Dec
n使用数字表示当前月份1 到 12
t指定月份的天数28 到 31
L指定的年份是否为闰年如果是闰年值为 1,否则为 0
o根据 ISO-8601 标准格式使用数字表示年份,这和 Y 的作用相同(PHP 5.1.0 新增)1999 or 2019
Y使用 4 位数字表示完整的年份例如:1999 或 2019
y使用 2 位数字表示年份例如:99 或 03
a小写的上午和下午值am 或 pm
A大写的上午和下午值AM 或 PM
BSwatch Internet 标准时000 到 999
g使用 12 小时格式表示小时数1 到 12
G使用 24 小时格式表示小时数0 到 23
h使用 12 小时格式表示小时数,有前导零01 到 12
H使用 24 小时格式表示小时数,有前导零00 到 23
i使用两位数字表示分钟数,有前导零00 到 59>
s使用两位数字表示秒数,有前导零00 到 59>
u毫秒(PHP 5.2.2 新增)。需要注意的是 date() 函数总是返回 000000,因为它只接受 integer 参数,而 DateTime::format() 才支持毫秒例如:654321
e时区标识例如:UTC、GMT、Atlantic/Azores
I(大写的“i”)是否为夏令时夏令时为 1,否则为 0
O与格林尼治时间相差的小时数例如:+0200
P与格林尼治时间(GMT)的差别,小时和分钟之间由冒号分隔例如:+02:00
T本机所在的时区例如:EST、MDT(在 windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)
Z时差偏移量的秒数,UTC 西边的时区偏移量总是负的,UTC 东边的的时区偏移量总是正的-43200 到 43200
cISO-8601 格式的日期2014-02-12T15:19:21+00:00
rRFC 822 格式的日期例如:Thu,21 Dec 2000 16:01:07 +0200
U从 UNIX 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数

2.4 PHP time():获取当前时间戳

在 UNIX 系统中,日期与时间表示为自 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起到当前时刻的总秒数,这种时间称为 UNIX 时间戳

UNIX 时间截提供了一种统一、简洁的时间表示方式,在不同的操作系统中均支持这种时间表示方式,同一时间在 UNIX 和 Windows 系统中均以相同的 UNIX 时间戳表示,所以不需要在不同的系统中进行转换。同时,UNIX 时间戳是一个时间差,与时区没有关系,无论当前 PHP 中使用的是何种时区,其 UNIX 时间戳是唯一的。

【示例】使用 time() 函数获取当前时间戳 与 PHP实现倒计时功能

1<?php
2    $time = time();
3    echo '当前的时间戳为:'.<!DOCTYPE html>
4<html>
5<head>
6    <title>PHP实现倒计时功能</title>
7</head>
8<body>
9<?php
10    // 设置时区
11    date_default_timezone_set('PRC');
12    //配置考试的开始结束时间
13    $starttimestr = date('Y-m-d H:i:s', strtotime('now'));
14    $endtimestr   = date('Y-m-d H:i:s', strtotime('+2 hours 30 minutes'));
15    $starttime    = strtotime($starttimestr);
16    $endtime      = strtotime($endtimestr);
17    $nowtime      = time();
18    if ($nowtime < $starttime) {
19        exit("考试已经结束了,考试时间是:{$starttimestr}至{$endtimestr}");
20    }
21    if ($endtime >= $nowtime) {
22        $lefttime = $endtime - $nowtime; //实际剩下的时间(秒)
23    } else {
24        $lefttime = 0;
25        exit("考试已经结束!");
26    }
27?>
28<p>考试开始时间:<?php echo $starttimestr; ?></p>
29<p>考试结束时间:<?php echo $endtimestr; ?></p>
30<p>
31    距离考试结束还有:
32    <span id="RemainD"></span> 天
33    <span id="RemainH"></span> 小时
34    <span id="RemainM"></span> 分钟
35    <span id="RemainS"></span> 秒
36</p>
37<script type="text/javascript">
38    var runtimes = 0;
39    function GetRTime() {
40        var lefttime = <?php echo $lefttime; ?> * 1000 - runtimes * 1000;
41        if (lefttime >= 0) {
42            var nD = Math.floor(lefttime / (1000 * 60 * 60 * 24)) % 24;
43            var nH = Math.floor(lefttime / (1000 * 60 * 60)) % 24;
44            var nM = Math.floor(lefttime / (1000 * 60)) % 60;
45            var nS = Math.floor(lefttime / 1000) % 60;
46            document.getElementById("RemainD").innerHTML = nD;
47            document.getElementById("RemainH").innerHTML = nH;
48            document.getElementById("RemainM").innerHTML = nM;
49            document.getElementById("RemainS").innerHTML = nS;
50            runtimes++;
51            setTimeout("GetRTime()", 1000);
52        } else {
53            alert('考试结束了!');
54            location.reload();
55        }
56    }
57    onload = function() {
58        GetRTime();
59    }
60</script>
61</body>
62</html>$time."\n";
63    date_default_timezone_set('GMT');
64    $time = time();
65    echo '将时区设置为零时区,获取的时间戳为:'.$time;
66?>

运行结果如下:

1当前的时间戳为:1585203148
2将时区设置为零时区,获取的时间戳为:1585203148

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值