什么是unix时间戳公式?

时间:2011-09-17 15:59:53

标签: php datetime timestamp unix-timestamp

首先,我知道这个问题有点被问到/有点回答: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);

如果你无法帮助我自定义功能或公式,至少可以给我一个更好的解释如何做到这一点。它是用很多语言完成的,必须有人知道如何做到这一点。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

以下是date()DateTime::setTimestamp()用于从unix时间戳计算日期的函数:

https://github.com/php/php-src/blob/d57eefe6227081001978c3a63224065af8b5728e/ext/date/lib/unixtime2tm.c#L39

正如你所看到的,闰年等等有点复杂。

-

那就是说,如果你只需要一周的某一天,你似乎可以安全地忽略闰年,只需使用你在问题中给出的公式:$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";