首先,我知道这个问题有点被问到/有点回答:Calculate day number from an unix-timestamp in a math way?。
我需要一个自定义函数/公式。所以它只返回ISO格式的日期。 “YYYY-MM-DD”。
eg. 1316278442 = 2011-09-17
由Ext编辑! 这是错的!请不要读这个。
我整天都在这里!我唯一能成功的就是一周中的某一天。
<击> <撞击> $一周中的某天=($时间戳/ 86400)%7; //这里1是星期六,7星期五 击>
速度是问题,这就是为什么我不想使用date('Y-m-d',$timestamp);
如果你无法帮助我自定义功能或公式,至少可以给我一个更好的解释如何做到这一点。它是用很多语言完成的,必须有人知道如何做到这一点。
提前感谢您的帮助。
答案 0 :(得分:6)
以下是date()
和DateTime::setTimestamp()
用于从unix时间戳计算日期的函数:
正如你所看到的,闰年等等有点复杂。
-
那就是说,如果你只需要一周的某一天,你似乎可以安全地忽略闰年,只需使用你在问题中给出的公式:$dayOfWeek=($timestamp/86400)%7
答案 1 :(得分:1)
确定。功能完成。它需要一个unix时间戳并返回YYYY-MM-DD。这就是我所需要的。我希望它可以帮助任何人...
<?php
$t=1325522004;//return 2011-09-19
/*
* Transform a Unix Timestamp to ISO 8601 Date format YYYY-MM-DD
* @param unix timestamp
* @return Returns a formated date (YYYY-MM-DD) or false
*/
function unixToIso8601($timestamp){
if($timestamp<0){return false;}//Do not accept negative values
/* Too many constants, add this to a class to speed things up. */
$year=1970;//Unix Epoc begins 1970-01-01
$dayInSeconds=86400;//60secs*60mins*24hours
$daysInYear=365;//Non Leap Year
$daysInLYear=$daysInYear+1;//Leap year
$days=(int)($timestamp/$dayInSeconds);//Days passed since UNIX Epoc
$tmpDays=$days+1;//If passed (timestamp < $dayInSeconds), it will return 0, so add 1
$monthsInDays=array();//Months will be in here ***Taken from the PHP source code***
$month=11;//This will be the returned MONTH NUMBER.
$day;//This will be the returned day number.
while($tmpDays>=$daysInYear){//Start adding years to 1970
$year++;
if(isLeap($year)){
$tmpDays-=$daysInLYear;
}
else{
$tmpDays-=$daysInYear;
}
}
if(isLeap($year)){//The year is a leap year
$tmpDays--;//Remove the extra day
$monthsInDays=array(-1,30,59,90,120,151,181,212,243,273,304,334);
}
else{
$monthsInDays=array(0,31,59,90,120,151,181,212,243,273,304,334);
}
while($month>0){
if($tmpDays>$monthsInDays[$month]){
break;//$month+1 is now the month number.
}
$month--;
}
$day=$tmpDays-$monthsInDays[$month];//Setup the date
$month++;//Increment by one to give the accurate month
return $year.'-'.(($month<10)?'0'.$month:$month).'-'.(($day<10)?'0'.$day:$day);
}
function isLeap($y){
return (($y)%4==0&&(($y)%100!=0||($y)%400==0));
}
echo unixToIso8601($t);
?>
答案 2 :(得分:0)
您可以先使用unixtojd()转换为julian,然后使用cal_from_jd分割为年,月,日。 它快一点。下面的代码给出了我的结果:
2009-02-13 0.13018703460693 seconds using date()
2009-02-13 0.037487983703613 seconds using unixtojd(),cal_from_jd(),and sprintf()
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_start = microtime_float();
$unix_timestamp = 1234567890;
for($i=0;$i<10000;$i++) {
$d = date('Y-m-d',$unix_timestamp);
}
$time_stop = microtime_float();
echo $d . " " . ($time_stop - $time_start) . " seconds using date()<br>\n";
//////////////////////////
$time_start = microtime_float();
$unix_timestamp = 1234567890;
for($i=0;$i<10000;$i++) {
$julian_date = unixtojd($unix_timestamp);
$date_array = cal_from_jd($julian_date, CAL_GREGORIAN);
$d = sprintf('%d-%02d-%02d',$date_array['year'],$date_array['month'],$date_array['day']);
}
$time_stop = microtime_float();
echo $d . " " . ($time_stop - $time_start) . " seconds using unixtojd(),cal_from_jd(),and sprintf()<br>\n";