UNIX時間戳及日期的轉換與計算

UNIX時間戳是保存日期和時間的一種緊湊簡潔的方法,是大多數UNIX系統中保存當前日期和時間的一種方法,也是在大多數計算機語言中表示日期和時間的一種標準格式。以32位整數表示格林威治標準時間,例如,使用證書11230499325表示當前時間的時間戳。UNIX時間戳是從1970年1月1日零點(UTC/GMT的午夜)開始起到當前時間所通過的秒數。1970年1月1日零點做爲全部日期計算的基礎,這個日期一般成爲UNIX紀元。php

  由於UNIX時間戳是一個32位的數字格式,因此特別適用於計算機處理,例如計算兩個時間點之間相差的天數。另外,因爲文化和地區的差別,存在不一樣的時間格式,以及時區的問題。因此UNIX時間戳也是根據一個時區進行標準化而設計的一種通用格式,而且這種格式能夠很容易地轉換爲任何格式。也由於UNIX時間戳是一個32位的證書表示的,因此在處理1902年之前或2038年之後的事件將會遇到一些問題。另外,在Windows下,因爲時間戳不能爲負數,因此使用PHP中提供的時間戳函數處理1970年以前的日期,就會發生錯誤。要使PHP代碼具備可移植性,必須記住這一點。

將日期和時間轉變成UNIX時間戳html

在PHP中,若是須要將日期和時間轉變成UNIX時間戳,能夠調用mktime()函數。該函數的原型以下所示:函數

int mktime([int hour [,int minute[,int second[,int month[,int day[int year]]]]]])學習

該函數中全部參數都是可選的,若是參數爲空,默認將當前時間轉變成UNIX時間戳。這樣,和直接調用time()函數獲取當前的UNIX時間戳功能相同。參數也能夠從右向左省略,任何省略的參數會被設置成本地日期和時間的當前值。若是隻想轉變日期,對具體的時間不在意,能夠將前三個轉變時間的參數都設置爲0.mktime()函數對於日期運算和驗證很是有用,它能夠自動校政越界的輸入。以下所示:spa

1
2
3
4
5
6
<?php
echo date ( "Y-m-d" , mktime (0,0,0,12,36,2008)). "\n" ;    //日期超過31天,計算後輸出 2009-01-05
echo date ( "Y-m-d" , mktime (0,0,0,14,1,2010)). "\n" ;     //月份超過12月,計算後輸出2011-02-01
echo date ( "Y-m-d" , mktime (0,0,0,1,1,2012)). "\n" ;      //沒有問題的轉變,輸出結果2012-01-01
echo date ( "Y-m-d" , mktime (0,0,0,1,1,99)). "\n" ;        //會將99年轉變爲1999年, 1990-01-01
?>

若是有須要將任何英文文本的日期時間描述直接解析爲UNIX時間戳,可使用strtotime()函數,該函數的圓形以下所示:設計

int strtotime(string time[,int now])unix

函數strtotime()能夠用英語的天然語言建立謳歌時刻的時間戳,接受一個包含美國英語日期格式的字符串並嘗試將其解析爲UNIX時間戳(自January 1 1970 00:00:00 GMT起的描述),其值相對於now參數給出的時間,若是沒有提供次參數則用系統當前時間。該函數執行成功則返回時間戳,不然返回FALSE。和mktime()的對好比下所示:code

1
2
3
4
5
6
<?php
echo date ( "Y-m-d" , strtotime ( "now" ));                  //輸出如今的時間戳
echo date ( "Y-m-d" , strtotime ( "8 may 2012" ));           //輸出2012-05-08
echo date ( "Y-m-d" , strtotime ( "+1 day" ));               //輸出如今的日期加1天
echo date ( "Y-m-d" , strtotime ( "last monday" ));          //輸出2012-04-02
?>

下例經過使用strtotime()函數編寫一個記念日的倒計時程序,來介紹一下該函數在項目開發中的實際應用,示例代碼以下所示:htm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$now = strtotime ( "now" ); //當前時間
$endtime = strtotime ( "2014-08-18 08:08:08" ); //設定畢業時間,轉成時間戳
 
$second = $endtime - $now ; //獲取畢業時間到如今時間的時間戳(秒數)
$year = floor ( $second /3600/24/365); //從這個時間戳中換算出年頭數
 
$temp = $second - $year *365*24*3600; //從這個時間戳中去掉全年的秒數,就剩下月份的秒數
$month = floor ( $temp /3600/24/30); //從這個時間戳中共換算出月數
 
$temp = $temp - $month *30*3600*24; //從時間戳中去掉整月的秒數,就剩下天的描述
$day = floor ( $temp /24/3600); //從這個時間戳中換算出剩餘的天數
 
$temp = $temp - $day *3600*24; //從這個時間戳中去掉成天的秒數,就剩下小時的秒數
$hour = floor ( $temp /3600); //從這個時間戳中換算出剩餘的小時數
 
$temp = $temp - $hour *3600; //從時間戳中去掉小時的秒數,就剩下分的秒數
$minute = floor ( $temp /60); //從這個時間戳中換算出剩餘的分數
 
$second1 = $temp - $minute *60; //最後只有剩餘的秒數了
 
echo "距離培訓畢業還有($year)年($month)月($day)天($hour)小時($minute)分($second1)秒。" ;
?>

注意:若是給定的年份是兩位數字的格式,則其值0-69表示2000-2069,70-100表示1970-2000。教程

日期的計算

在PHP中,計算兩個日期之間相隔的長度,最簡單的方法就是經過計算兩個UNIX時間戳之差來得到。例如,在PHP腳本中接收來自HTML表單用戶提交的出生日期,計算這個用戶的年齡。以下所示:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
//從表單中接收用戶提交的出生日期中的年份、月份、天
$year = 1981;
$month = 11;
$day = 05;
$birthday = mktime (0,0,0, $month , $day , $year ); //將出生日期轉變爲UNIX時間戳
$nowdate = time(); //調用time()函數獲取當前時間的UNIX時間戳
$ageunix = $nowdate - $birthday ; //兩個時間戳相減獲取用戶年齡的UNIX時間戳
$age = floor ( $ageunix /3600/24/365); //將UNIX時間戳除以一年的秒數獲取用戶的年齡
echo "年齡:$age" ;
 
?>

在以上的腳本中,調用mktime()函數將從用戶出生日期轉變爲UNIX時間戳,再調用time()函數獲取當前時間的UNIX時間戳。由於這個日期的格式都是使用整數表示的,因此能夠將他們相減。又將計算後獲取的UNIX時間戳除以一年的秒數,將UNIX時間戳轉變爲以年度量的單位。

 
相關文章
相關標籤/搜索