PHP中UNIX時(shí)間戳和日期間的轉(zhuǎn)換與計(jì)算實(shí)例
UNIX時(shí)間戳是保存日期和時(shí)間的一種緊湊簡(jiǎn)潔的方法,是大多數(shù)UNIX系統(tǒng)中保存當(dāng)前日期和時(shí)間的一種方法,也是在大多數(shù)計(jì)算機(jī)語(yǔ)言中表示日期和時(shí)間的一種標(biāo)準(zhǔn)格式。以32位整數(shù)表示格林威治標(biāo)準(zhǔn)時(shí)間,例如,使用證書11230499325表示當(dāng)前時(shí)間的時(shí)間戳。UNIX時(shí)間戳是從1970年1月1日零點(diǎn)(UTC/GMT的午夜)開(kāi)始起到當(dāng)前時(shí)間所經(jīng)過(guò)的秒數(shù)。1970年1月1日零點(diǎn)作為所有日期計(jì)算的基礎(chǔ),這個(gè)日期通常成為UNIX紀(jì)元。
因?yàn)閁NIX時(shí)間戳是一個(gè)32位的數(shù)字格式,所以特別適用于計(jì)算機(jī)處理,例如計(jì)算兩個(gè)時(shí)間點(diǎn)之間相差的天數(shù)。另外,由于文化和地區(qū)的差異,存在不同的時(shí)間格式,以及時(shí)區(qū)的問(wèn)題。所以UNIX時(shí)間戳也是根據(jù)一個(gè)時(shí)區(qū)進(jìn)行標(biāo)準(zhǔn)化而設(shè)計(jì)的一種通用格式,并且這種格式可以很容易地轉(zhuǎn)換為任何格式。也因?yàn)閁NIX時(shí)間戳是一個(gè)32位的證書表示的,所以在處理1902年以前或2038年以后的事件將會(huì)遇到一些問(wèn)題。另外,在Windows下,由于時(shí)間戳不能為負(fù)數(shù),所以使用PHP中提供的時(shí)間戳函數(shù)處理1970年之前的日期,就會(huì)發(fā)生錯(cuò)誤。要使PHP代碼具有可移植性,必須記住這一點(diǎn)。
將日期和時(shí)間轉(zhuǎn)變成UNIX時(shí)間戳
在PHP中,如果需要將日期和時(shí)間轉(zhuǎn)變成UNIX時(shí)間戳,可以調(diào)用mktime()函數(shù)。該函數(shù)的原型如下所示:
int mktime([int hour [,int minute[,int second[,int month[,int day[int year]]]]]])
該函數(shù)中所有參數(shù)都是可選的,如果參數(shù)為空,默認(rèn)將當(dāng)前時(shí)間轉(zhuǎn)變成UNIX時(shí)間戳。這樣,和直接調(diào)用time()函數(shù)獲取當(dāng)前的UNIX時(shí)間戳功能相同。參數(shù)也可以從右向左省略,任何省略的參數(shù)會(huì)被設(shè)置成本地日期和時(shí)間的當(dāng)前值。如果只想轉(zhuǎn)變?nèi)掌?,?duì)具體的時(shí)間不在乎,可以將前三個(gè)轉(zhuǎn)變時(shí)間的參數(shù)都設(shè)置為0.mktime()函數(shù)對(duì)于日期運(yùn)算和驗(yàn)證非常有用,它可以自動(dòng)校政越界的輸入。如下所示:
<?php
echo date("Y-m-d",mktime(0,0,0,12,36,2008))."\n"; //日期超過(guò)31天,計(jì)算后輸出 2009-01-05
echo date("Y-m-d",mktime(0,0,0,14,1,2010))."\n"; //月份超過(guò)12月,計(jì)算后輸出2011-02-01
echo date("Y-m-d",mktime(0,0,0,1,1,2012))."\n"; //沒(méi)有問(wèn)題的轉(zhuǎn)變,輸出結(jié)果2012-01-01
echo date("Y-m-d",mktime(0,0,0,1,1,99))."\n"; //會(huì)將99年轉(zhuǎn)變?yōu)?999年, 1990-01-01
?>
如果有需要將任何英文文本的日期時(shí)間描述直接解析為UNIX時(shí)間戳,可以使用strtotime()函數(shù),該函數(shù)的圓形如下所示:
int strtotime(string time[,int now])
函數(shù)strtotime()可以用英語(yǔ)的自然語(yǔ)言創(chuàng)建謳歌時(shí)刻的時(shí)間戳,接受一個(gè)包含美國(guó)英語(yǔ)日期格式的字符串并嘗試將其解析為UNIX時(shí)間戳(自January 1 1970 00:00:00 GMT起的描述),其值相對(duì)于now參數(shù)給出的時(shí)間,如果沒(méi)有提供次參數(shù)則用系統(tǒng)當(dāng)前時(shí)間。該函數(shù)執(zhí)行成功則返回時(shí)間戳,否則返回FALSE。和mktime()的對(duì)比如下所示:
<?php
echo date("Y-m-d", strtotime("now")); //輸出現(xiàn)在的時(shí)間戳
echo date("Y-m-d", strtotime("8 may 2012")); //輸出2012-05-08
echo date("Y-m-d", strtotime("+1 day")); //輸出現(xiàn)在的日期加1天
echo date("Y-m-d", strtotime("last monday")); //輸出2012-04-02
?>
下例通過(guò)使用strtotime()函數(shù)編寫一個(gè)紀(jì)念日的倒計(jì)時(shí)程序,來(lái)介紹一下該函數(shù)在項(xiàng)目開(kāi)發(fā)中的實(shí)際應(yīng)用,示例代碼如下所示:
<?php
$now =strtotime("now"); //當(dāng)前時(shí)間
$endtime= strtotime("2014-08-18 08:08:08"); //設(shè)定畢業(yè)時(shí)間,轉(zhuǎn)成時(shí)間戳
$second = $endtime-$now; //獲取畢業(yè)時(shí)間到現(xiàn)在時(shí)間的時(shí)間戳(秒數(shù))
$year = floor($second/3600/24/365); //從這個(gè)時(shí)間戳中換算出年頭數(shù)
$temp =$second-$year*365*24*3600; //從這個(gè)時(shí)間戳中去掉整年的秒數(shù),就剩下月份的秒數(shù)
$month=floor($temp/3600/24/30); //從這個(gè)時(shí)間戳中共換算出月數(shù)
$temp=$temp-$month*30*3600*24; //從時(shí)間戳中去掉整月的秒數(shù),就剩下天的描述
$day = floor($temp/24/3600); //從這個(gè)時(shí)間戳中換算出剩余的天數(shù)
$temp=$temp-$day*3600*24; //從這個(gè)時(shí)間戳中去掉整天的秒數(shù),就剩下小時(shí)的秒數(shù)
$hour = floor($temp/3600); //從這個(gè)時(shí)間戳中換算出剩余的小時(shí)數(shù)
$temp=$temp- $hour*3600; //從時(shí)間戳中去掉小時(shí)的秒數(shù),就剩下分的秒數(shù)
$minute=floor($temp/60); //從這個(gè)時(shí)間戳中換算出剩余的分?jǐn)?shù)
$second1=$temp-$minute*60; //最后只有剩余的秒數(shù)了
echo "距離培訓(xùn)畢業(yè)還有($year)年($month)月($day)天($hour)小時(shí)($minute)分($second1)秒。";
?>
注意:如果給定的年份是兩位數(shù)字的格式,則其值0-69表示2000-2069,70-100表示1970-2000。
日期的計(jì)算
在PHP中,計(jì)算兩個(gè)日期之間相隔的長(zhǎng)度,最簡(jiǎn)單的方法就是通過(guò)計(jì)算兩個(gè)UNIX時(shí)間戳之差來(lái)獲得。例如,在PHP腳本中接收來(lái)自HTML表單用戶提交的出生日期,計(jì)算這個(gè)用戶的年齡。如下所示:
<?php
//從表單中接收用戶提交的出生日期中的年份、月份、天
$year = 1981;
$month = 11;
$day = 05;
$birthday = mktime(0,0,0,$month,$day,$year); //將出生日期轉(zhuǎn)變?yōu)閁NIX時(shí)間戳
$nowdate = time(); //調(diào)用time()函數(shù)獲取當(dāng)前時(shí)間的UNIX時(shí)間戳
$ageunix = $nowdate -$birthday; //兩個(gè)時(shí)間戳相減獲取用戶年齡的UNIX時(shí)間戳
$age = floor($ageunix/3600/24/365); //將UNIX時(shí)間戳除以一年的秒數(shù)獲取用戶的年齡
echo "年齡:$age";
?>
在以上的腳本中,調(diào)用mktime()函數(shù)將從用戶出生日期轉(zhuǎn)變?yōu)閁NIX時(shí)間戳,再調(diào)用time()函數(shù)獲取當(dāng)前時(shí)間的UNIX時(shí)間戳。因?yàn)檫@個(gè)日期的格式都是使用整數(shù)表示的,所以可以將他們相減。又將計(jì)算后獲取的UNIX時(shí)間戳除以一年的秒數(shù),將UNIX時(shí)間戳轉(zhuǎn)變?yōu)橐阅甓攘康膯挝弧?/p>
PS:這里再為大家推薦一個(gè)本站Unix時(shí)間戳轉(zhuǎn)換工具,附帶了各種語(yǔ)言下Unix時(shí)間戳的操作方法:
Unix時(shí)間戳(timestamp)轉(zhuǎn)換工具:http://tools.jb51.net/code/unixtime
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- php、mysql查詢當(dāng)天,查詢本周,查詢本月的數(shù)據(jù)實(shí)例(字段是時(shí)間戳)
- php獲取當(dāng)前月與上個(gè)月月初及月末時(shí)間戳的方法
- 時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
- PHP獲取毫秒級(jí)時(shí)間戳的方法
- PHP時(shí)間戳 strtotime()使用方法和技巧
- php 獲取今日、昨日、上周、本月的起始時(shí)間戳和結(jié)束時(shí)間戳的方法
- 使用php 獲取時(shí)間今天明天昨天時(shí)間戳的詳解
- php日期轉(zhuǎn)時(shí)間戳,指定日期轉(zhuǎn)換成時(shí)間戳
- php 計(jì)算兩個(gè)時(shí)間戳相隔的時(shí)間的函數(shù)(小時(shí))
- php獲取本年、本月、本周時(shí)間戳和日期格式的實(shí)例代碼
相關(guān)文章
php中用foreach來(lái)操作數(shù)組的代碼
php中用foreach來(lái)操作數(shù)組的代碼,需要的朋友可以參考下。2011-07-07PHP接口多繼承及tarits實(shí)現(xiàn)多繼承效果的方法
這篇文章主要介紹了PHP接口多繼承及tarits實(shí)現(xiàn)多繼承效果的方法,結(jié)合實(shí)例形式分析了php基于接口的多繼承及PHP5.4中引入的tarits實(shí)現(xiàn)多繼承功能簡(jiǎn)單操作技巧,需要的朋友可以參考下2018-01-01PHP實(shí)現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)多維數(shù)組轉(zhuǎn)字符串和多維數(shù)組轉(zhuǎn)一維數(shù)組的方法,以實(shí)例形式分別介紹了php數(shù)組與字符串的轉(zhuǎn)換技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08PHP實(shí)現(xiàn)微信圖片上傳到服務(wù)器的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)微信圖片上傳到服務(wù)器的方法,涉及php基于curl操作圖片文件的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06PHP使用imap_open實(shí)現(xiàn)讀取QQ郵箱
這篇文章主要為大家詳細(xì)介紹了PHP如何使用imap_open實(shí)現(xiàn)讀取QQ郵箱功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02PHP實(shí)現(xiàn)刪除非站內(nèi)外部鏈接實(shí)例代碼
一般在做網(wǎng)站系統(tǒng)的時(shí)候,出于優(yōu)化等因素的考慮需要再添加文章的時(shí)候刪除掉不是本站的鏈接,對(duì)于這一要求可以通過(guò)讓PHP處理下文章內(nèi)容,來(lái)達(dá)到文章外部鏈接的自動(dòng)刪除的效果。需要的朋友可以參考下2014-06-06