찾다
백엔드 개발PHP 튜토리얼PHP中的日期处理_PHP

PHP中的日期处理_PHP

Jun 01, 2016 pm 12:38 PM
기능다루다우리를날짜시간

正打算用PHP编写一种帮助处理系统。我发现我必须知道处理完最后一位客户的问题后已经过去了多长时间当我过去用ASP时解决这个问题相当简单ASP有相应的函数DateDiff可以给出两个日期间间隔多少月、多少天和多少秒。当我搜寻完PHP手册后我发现PHP并没有类似的函数。



本文包含以下内容


1、 得到目前的日期和时间
我们有多少种方式

2、 改变日期显示的方式
日期和时间的显示形式

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

4、 改变日期

a
. 增加时间

b
. 减去时间

c
. 找出两日期之间的间隔

5、 为PHP添加DateAdd函数

6、 为PHP添加DateDiff函数



**得到目前的日期和时间



在Unix中
时间的表示方式为计算从1970年1月1日零时起所过去的秒数这称为UNIX 时间戳(Unix Epoch)

如果我们有这样一段的代码




echo time();

?>

将返回值958905820

而此时的时间为2000年5月21日12时43分。

你也许会说这相当不错。当这对我毫无帮助
或者只有一点帮助。在PHP中对日期处理的函数都必须用到由time()返回的时间戳值。同时由于PHP在Unix和Windows系统中均使用同样的时间戳值这就允许你不需要修改代码即可在不同的系统间移植。另外的一个好处是time()函数返回的是一个整数你可以将其作为整数字段或文本字段存入数据库而不必使用特别的日期/时间字段。

你已经基本了解了Unix的时间戳值
现在让我们来展示它的实际用途。



改变日期显示的方式
日期和时间的显示形式



PHP提供两个办法来将Unix的时间戳值转换成为有用的数据。第一个是date
()函数。这个函数有两个参数第一个字符串用于设定你所希望返回的格式第二个为Unix的时间戳值。

格式化字符串通过一些简单的特殊格式化字符来显示你所希望看到的格式的日期和时间。假设你希望日期以这样的格式显示“18h01 Sunday 21 May”。

我们需要对字符串中的每一部分使用一个特殊格式化字符
你可以从PHP手册中日期和时间函数库中找到。这样的特殊格式化字符数量不少他们所表示的类似于星期几、月的英文名、用2位或4位数表示的年份是否是上午AM或下午PM以及其他。对于这个例子我们需要的特殊字符为

‘H’
24 小时制的小时

‘i’
分钟

‘l’
星期几的英文全名

‘d’
本月的第几日

‘F’
月份的英文全名

因此我们的格式化字符串为”Hhi l d F”
PHP代码为



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

?>

当我们执行这段代码
我们发现我们所得到的结果为

180609 Sunday 21 May

这样的结果看起来有些奇怪。让我们再查一下PHP手册
原来’h’所代表的是12 小时制的小时数。这再次证明了一句真理“计算机只做你所告诉它该做的而不是你想要它做的”。我们有两个选择。第一个是在h前使用转义字符“\”

echo date ("H\hi l d F", time());

我们得到这样的结果


18h12 Sunday 21 May

这正是我们所要的。但如果我们在一个十分复杂的句子中需要包含日期和时间
我们是否需要对每个字符使用转义字符

答案当然是不。我们使用另一个函数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 "

";

$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 "

";

$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 "

";

$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 "
~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 "

"

;

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)."
"
;

$newtime
= DateAdd ("n",50 ,$currenttime);

echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."
"
;

$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程序中。



原文作者是Allan Kent[akent@itsolutions.co.za] 发表在http://www.phpbuilder.com/

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?세션을 저장하기 위해 데이터베이스를 사용하면 어떤 장점이 있습니까?Apr 24, 2025 am 12:16 AM

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?PHP에서 사용자 정의 세션 처리를 어떻게 구현합니까?Apr 24, 2025 am 12:16 AM

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

세션 ID 란 무엇입니까?세션 ID 란 무엇입니까?Apr 24, 2025 am 12:13 AM

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?무국적 환경 (예 : API)에서 세션을 어떻게 처리합니까?Apr 24, 2025 am 12:12 AM

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 ​​있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.

세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?세션과 관련된 크로스 사이트 스크립팅 (XSS) 공격으로부터 어떻게 보호 할 수 있습니까?Apr 23, 2025 am 12:16 AM

세션 관련 XSS 공격으로부터 응용 프로그램을 보호하려면 다음 조치가 필요합니다. 1. 세션 쿠키를 보호하기 위해 Httponly 및 Secure 플래그를 설정하십시오. 2. 모든 사용자 입력에 대한 내보내기 코드. 3. 스크립트 소스를 제한하기 위해 컨텐츠 보안 정책 (CSP)을 구현하십시오. 이러한 정책을 통해 세션 관련 XSS 공격을 효과적으로 보호 할 수 있으며 사용자 데이터가 보장 될 수 있습니다.

PHP 세션 성능을 어떻게 최적화 할 수 있습니까?PHP 세션 성능을 어떻게 최적화 할 수 있습니까?Apr 23, 2025 am 12:13 AM

PHP 세션 성능을 최적화하는 방법 : 1. 지연 세션 시작, 2. 데이터베이스를 사용하여 세션을 저장, 3. 세션 데이터 압축, 4. 세션 수명주기 관리 및 5. 세션 공유 구현. 이러한 전략은 높은 동시성 환경에서 응용의 효율성을 크게 향상시킬 수 있습니다.

SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?SESSION.GC_MAXLIFETIME 구성 설정은 무엇입니까?Apr 23, 2025 am 12:10 AM

THESESSION.GC_MAXLIFETIMESETTINGINSTTINGTINGSTINGTERMINESTERMINESTERSTINGSESSIONDATA, SETINSECONDS.1) IT'SCONFIGUDEDINPHP.INIORVIAINI_SET ()

PHP에서 세션 이름을 어떻게 구성합니까?PHP에서 세션 이름을 어떻게 구성합니까?Apr 23, 2025 am 12:08 AM

PHP에서는 Session_Name () 함수를 사용하여 세션 이름을 구성 할 수 있습니다. 특정 단계는 다음과 같습니다. 1. Session_Name () 함수를 사용하여 Session_Name ( "my_session")과 같은 세션 이름을 설정하십시오. 2. 세션 이름을 설정 한 후 세션을 시작하여 세션을 시작하십시오. 세션 이름을 구성하면 여러 응용 프로그램 간의 세션 데이터 충돌을 피하고 보안을 향상시킬 수 있지만 세션 이름의 독창성, 보안, 길이 및 설정 타이밍에주의를 기울일 수 있습니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는