2

秒数を日付に変換しようとしています。これが私が現在持っているものです(phpで):

function secondsToTime($inputSeconds) {
    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;
    $secondsInAMonth = 30 * $secondsInADay;
    $secondsInAYear = 12 * $secondsInAMonth;

    $years = floor($inputSeconds / $secondsInAYear);

    $monthSeconds = $inputSeconds % $secondsInAYear;
    $months = floor($monthSeconds / $secondsInAMonth);

    $daySeconds = $monthSeconds % $secondsInAMonth;
    $days = floor($daySeconds / $secondsInADay);

    $hourSeconds = $daySeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    $obj = array(
        'years' => (int) $years,
        'months' => (int) $months,
        'days' => (int) $days,
        'hours' => (int) $hours,
        'minutes' => (int) $minutes,
        'seconds' => (int) $seconds
    );
    return $obj;
}

しかし、これは月の異なる長さを考慮していないため、十分に正確ではありません...適切に行うための既知のアルゴリズムまたは何かがありますか??

前もって感謝します

編集:

申し訳ありませんが、英語は私の言語ではありません...日付に変換する必要があると言いましたが、実際に行っているのは2つの日付の違いです。結果は数秒で得られ、年、月、日、時、分、秒

4

5 に答える 5

5

車輪を再発明する必要はありません。次のようにDateTimeを使用します。

function getInterval($seconds)
{
   $obj = new DateTime();
   $obj->setTimeStamp(time()+$seconds);
   return (array)$obj->diff(new DateTime());
}
//var_dump(getInterval(300));

-結果に含まれるフィールドを確認し、本当に必要なものだけを選択することもできます

于 2013-11-01T14:42:04.097 に答える
1

jerdiggity のソリューションは、やや異なる問題に対して非常に役立つことがわかりました。「{number} {正しく複数単位} 前に追加されました」のように、人間が読める形式で行を作成してからの時間の最高単位を表示する必要がありました。 唯一の実際の変更は、ビューの外でそれを処理するために、複数に基づいて条件付きで配列キーを割り当てることでした。ZF2ヘルパーとして実行すると、次のようになりました。

class PrettyDate extends AbstractHelper
{

    /**
     * Ultra-simple Human readable date to-string conversion
     *
     * @param date - epoch
     *
     */
    public function __invoke($date)
    {   
        foreach ($this->secondsToTime($date) as $unit=>$measure) {
            if ($measure) {
                return "Added $measure $unit ago.";
            }
        }
    }

    private function secondsToTime($inputSeconds) {
        $then = new DateTime(date('Y-m-d H:i:s', $inputSeconds));
        $now = new DateTime(date('Y-m-d H:i:s', time()));
        $diff = $then->diff($now);
        return array(
          ($diff->y>1?'years':'year') => $diff->y, 
          ($diff->m>1?'months':'month') => $diff->m, 
          ($diff->d>1?'days':'day') => $diff->d, 
          ($diff->h>1?'hours':'hour') => $diff->h,
          ($diff->i>1?'minutes':'minute') => $diff->i,
          ($diff->s>1?'seconds':'second') => $diff->s
        );
    }
}

ありがとう、ジャーディギティ。

于 2015-02-02T19:32:49.787 に答える
0

これを長い道のりで行っている特定の理由はありますか? エポック時間を取得して変換する組み込み関数があります。

#Getting current epoch time in PHP
time()  // current Unix timestamp 

#Convert from epoch to human readable date in PHP
$epoch = 1340000000;
echo date('r', $epoch); // output as RFC 2822 date - returns local time
echo gmdate('r', $epoch); // returns GMT/UTC time    

#Use the DateTime class.
$epoch = 1344988800; 
$dt = new DateTime("@$epoch");  // convert UNIX timestamp to PHP DateTime
echo $dt->format('Y-m-d H:i:s'); // output = 2012-08-15 00:00:00     
于 2013-11-01T14:43:58.393 に答える