>  기사  >  백엔드 개발  >  PHP에서 날짜 처리 방법은 무엇입니까

PHP에서 날짜 처리 방법은 무엇입니까

零下一度
零下一度원래의
2017-07-03 09:16:041202검색

이 기사에는 다음 내용이 포함되어 있습니다.
1. 현재 날짜와 시간을 확인하세요. 몇 가지 방법이 있나요?
2. 날짜 표시 방식 변경 - 날짜 및 시간 표시 형식
3. 날짜를 Unix 타임스탬프 값으로 변환
a 시간 빼기
c. two 날짜 사이의 간격
5. PHP용 DateAdd 함수 추가
6. PHP용 DateDiff 함수 추가

**현재 날짜 및 시간 가져오기

Unix에서는 시간을 1970년 1월 1일부터 계산하여 표현합니다. 0 이후 경과된 시간을 UNIX 타임스탬프(Unix Epoch)라고 합니다.
다음과 같은 코드가 있는 경우:

?  
echo time();  
?

는 958905820 값을 반환합니다.

지금 시간은 2000년 5월 21일 12시 43분입니다.
이거 꽤 좋다고 할 수도 있겠네요. 이것이 나에게 전혀 도움이 되지 않거나 약간만 도움이 될 때. PHP에서 모든 날짜 처리 함수는 time()에서 반환된 타임스탬프 값을 사용해야 합니다. 동시에, PHP는 Unix와 Windows 시스템 모두에서 동일한 타임스탬프 값을 사용하므로 코드를 수정하지 않고도 다른 시스템 간에 포팅할 수 있습니다. 또 다른 이점은 time() 함수가 정수를 반환하므로 특별한 날짜/시간 필드를 사용하지 않고도 데이터베이스에 정수 필드 또는 텍스트 필드로 저장할 수 있다는 것입니다.
Unix 타임스탬프 값에 대한 기본적인 이해가 끝났습니다. 이제 실제로 어떻게 사용되는지 보여드리겠습니다.

날짜 표시 방식 변경 - 날짜 및 시간 표시 형식

PHP는 Unix 타임스탬프 값을 유용한 데이터로 변환하는 두 가지 방법을 제공합니다. 첫 번째는 date() 함수입니다. 이 함수는 두 개의 매개변수를 사용합니다. 첫 번째 문자열은 반환하려는 형식을 설정하는 데 사용되고 두 번째 문자열은 Unix 타임스탬프 값입니다.
형식 문자열은 몇 가지 간단한 특수 형식 문자를 사용하여 날짜와 시간을 보고 싶은 형식으로 표시합니다. 날짜를 "5월 21일 일요일 18h01" 형식으로 표시하려고 한다고 가정해 보겠습니다.
문자열의 각 부분에 특수 서식 문자를 사용해야 합니다. 이 문자는 PHP 설명서의 날짜 및 시간 함수 라이브러리에서 찾을 수 있습니다. 요일, 월의 영어 이름, 2자리 또는 4자리로 표시되는 연도, 오전(AM) 또는 오후(PM) 등을 나타내는 특수 서식 문자가 많이 있습니다. 이 예에 필요한 특수 문자는 다음과 같습니다.
'H' - 24시간제의 시간
'i' - 분
'l' - 요일의 전체 영어 이름
'd' - day of the Month
' F' - 월의 전체 영어 이름
따라서 형식 문자열은 "Hhi l d F"이고 PHP 코드는 다음과 같습니다.

?  
echo date ("Hhi l d F" ,time());  
?

이 코드를 실행하면 다음과 같은 결과가 나옵니다. 우리가 얻은 결과는 다음과 같습니다:

180609 Sunday 21 Sunday
이 결과는 조금 이상해 보입니다. PHP 매뉴얼을 다시 확인해 봅시다. 'h'는 12시간제의 시간을 나타냅니다. 이는 다시 한 번 진실을 입증합니다. "컴퓨터는 사용자가 원하는 작업을 수행하는 것이 아니라 사용자가 지시한 작업만 수행합니다." 우리에게는 두 가지 옵션이 있습니다. 첫 번째는 h 앞에 이스케이프 문자 ""를 사용하는 것입니다.
echo date ("Hhi l d F", time())
다음 결과를 얻습니다.
18h12 Sunday 21 Sunday
이것이 바로 우리가 원하는 것입니다. 하지만 매우 복잡한 문장에 날짜와 시간을 포함해야 한다면 각 문자에 이스케이프 문자를 사용해야 할까요?
답은 당연히 아니오입니다. 우리는 또 다른 함수 strftime()을 사용합니다.
strftime()에는 두 가지 이점이 있습니다. 첫 번째 이점은 이 기사의 범위를 벗어납니다. setlocale() 함수를 사용하면 strftime을 통해 해당 언어로 월 이름을 얻을 수 있습니다. 추가적인 이점은 문자열에 특수 날짜 및 시간 형식 문자를 포함할 수 있다는 것입니다. 이는 또한 date() 함수에 대한 모든 특수 서식 문자를 배우고 싶든 아니든 완전히 다른 서식 문자 집합을 배워야 함을 의미합니다.
strftime()은 특수 서식 문자 앞에 퍼센트 기호 %가 와야 한다는 점을 제외하면 date()와 다르지 않습니다. strftime() 함수를 사용하면 이전 예제의 코드는 다음과 같습니다.

?  
echo strftime ("%Hh%M %A %d %b" ,time());  
?


结果为:  
18h24 Sunday 21 May  
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函数无疑令人感到厌烦。  
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。  
下面是一个例子:  

?  
$date_time_array = getdate (time());  
echo $date_time_array[ "weekday"];  
?


返回的结果为:  
Sunday  
除了"weekday",该数组的其他部分为:  
"seconds" –秒  
"minutes" –分  
"hours" –小时  
“mday" - 本月的第几天  
"wday" -本周的第几天(数字)  
"mon" -月(数字)  
"year" –年  
"yday" - r本年的第几天(数字)  
"month" -月份全名  
我们现在可以得到容易辨认的日期和时间。那么其他呢?  

**转换现在的日期为Unix的时间戳值  

通常你必须处理一些日期或时间格式的数据。打开M$的一个Access数据库,所有的日期都以YYYY/MM/DD的格式存储,加入目前的日前即为2000/05/27。Mktime()函数可以将一个时间转换成Unix的时间戳值。  
函数的格式为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );  
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。  
代码如下:  

?  
echo mktime (0, 0,0 ,5, 27,2000 );  
?


由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。  

?  
$access_date = "2000/05/27";  
//explode()函数用一个字符串作为分界来分解另一个字符串。这个例子$access_date通过字符串”/”来分解  
$date_elements = explode("/" ,$access_date);  
// 此时  
// $date_elements[0] = 2000  
// $date_elements[1] = 5  
// $date_elements[2] = 27  
echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]);  
?


我们看一个比从Access数据库单纯获得日期更复杂的情况,我们得到一个以下格式的日期和时间:2000/05/27 02:40:21 PM  

?  
// 来自Access的字符串  
$date_time_string = "2000/05/27 02:40:21 PM";  
// 将字符串分解成3部分-日期、时间和上午/下午  
$dt_elements = explode(" " ,$date_time_string);  
// 分解日期  
$date_elements = explode("/" ,$dt_elements[ 0]);  
// 分解时间  
$time_elements = explode(":" ,$dt_elements[ 1]);  
// 如果是下午,我们将时间增加12小时以便得到24小时制的时间  
if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;}  
// 输出结果  
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]);  
?

**修改日期  

有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。  
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。  

?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo $timestamp;  
echo "p";  
$date_time_array = getdate( $timestamp);  
// 用mktime()函数重新产生Unix时间戳值  
$timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]);  
echo $timestamp;  
?


看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。  

?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo $timestamp;  
echo "p";  
$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"];  
// 用mktime()函数重新产生Unix时间戳值  
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);  
echo $timestamp;  
?


现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。  

?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo strftime( "%Hh%M %A %d %b",$timestamp);  
echo "p";  
$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"];  
// 用mktime()函数重新产生Unix时间戳值  
// 增加19小时  
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);  
echo strftime( "%Hh%M %A %d %b",$timestamp);  
echo "br~E after adding 19 hours";  
?


运行后得到:  
14h58 Saturday 03 Jun  
09h58 Sunday 04 Jun  
~E after adding 19 hours  
减少时间也是同样的-你只需要减少相应变量的值即可。  
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。  

**为PHP添加DateAdd函数  

正如在文章一开始我所说的-写本文的原因是因为我在PHP中找不到类似ASP的DateDiff函数。在介绍完PHP是如何处理日期和时间,让我们将ASP中常用的两个函数移植到PHP。第一个函数是DateAdd。  
根据Vbscript的文档,DateAdd(interval,number,date)函数的定义为“返回已添加指定时间间隔的日期。”  
Inetrval为表示要添加的时间间隔字符串表达式,例如分或天;number为表示要添加的时间间隔的个数的数值表达式;Date表示日期。  
Interval(时间间隔字符串表达式)可以是以下任意值:  
yyyy year年  
q Quarter季度  
m Month月  
y Day of year一年的数  
d Day天  
w Weekday一周的天数  
ww Week of year周  
h Hour小时  
n Minute分  
s Second秒  
w、y和d的作用是完全一样的,即在目前的日期上加一天,q加3个月,ww加7天。  

?  
function DateAdd ($interval, $number, $date) {  
$date_time_array = getdate($date);  
$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"];  
switch ($interval) {  
case "yyyy": $year +=$number; break;  
case "q": $month +=($number*3); break;  
case "m": $month +=$number; break;  
case "y":  
case "d":  
case "w": $day+=$number; break;  
case "ww": $day+=($number*7); break;  
case "h": $hours+=$number; break;  
case "n": $minutes+=$number; break;  
case "s": $seconds+=$number; break;  
}  
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);  
return $timestamp;}  
?  
我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码:  
?  
include('dateadd.inc');  
$temptime = time();  
echo strftime( "%Hh%M %A %d %b",$temptime);  
$temptime = DateAdd("n" ,50,$temptime);  
echo "p";  
echo strftime( "%Hh%M %A %d %b",$temptime);  
?


我们将得到:  
15h41 Saturday 03 Jun  
16h31 Saturday 03 Jun  
为PHP添加DateDiff函数  
现在DateAdd已经完成,那么DateDiff呢?  
根据文档,DateDiff(interval,date1,date2)函数的定义为“返回两个日期之间的时间间隔”。  
Intervals参数的用法与DateAdd函数中的相同。出于避免过于复杂的考虑,我们决定忽略Vbscript中DateDiff函数中其它复杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第一天是星期天还是星期一和一年中第一周的常数。而且我们只允许intervals有以下五个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)。  

Let's see what we can come up with: 下面的代码是我们所需要的:  

?  
Function DateDiff ($interval, $date1,$date2) {  
// 得到两日期之间间隔的秒数  
$timedifference = $date2 - $date1;  
switch ($interval) {  
case "w": $retval = bcdiv($timedifference ,604800); break;  
case "d": $retval = bcdiv( $timedifference,86400); break;  
case "h": $retval = bcdiv ($timedifference,3600); break;  
case "n": $retval = bcdiv( $timedifference,60); break;  
case "s": $retval = $timedifference; break;  
}  
return $retval;}  
?


将上面的代码存为datediff.inc文件,然后运行下面的代码:  

?  
include('datediff.inc');  
include('dateadd.inc');  
$currenttime = time();  
echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br";  
$newtime = DateAdd ("n",50 ,$currenttime);  
echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."br";  
$temptime = DateDiff ("n",$currenttime ,$newtime);  
echo "Interval between two times: ".$temptime;  
?


如果一切顺利,你可以看到以下结果:  
Current time: 16h23 Saturday 03 Jun  
Time plus 50 minutes: 17h13 Saturday 03 Jun  
Interval between two times: 50  
如果你在Unix机器上运行PHP,你必须编译PHP支持BC高精度函数。你必须从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目录下,重新编译PHP,编译时要加上--enable-bcmath的选项。(详细说明见PHP4中README.BCMATH)。PHP4的Windows版本则不需要做任何修补即可直接使用BC高精度函数。  
现在你已经得到处理日期和时间的函数,剩下的就是如何将其运用到你的PHP程序中

위 내용은 PHP에서 날짜 처리 방법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.