Jaki jest najlepszy sposób obliczenia całkowitej liczby sekund między dwiema datami? Do tej pory próbowałem czegoś w stylu:
$delta = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;
Jednak days
właściwość obiektu DateInterval wydaje się być uszkodzona w bieżącej kompilacji PHP 5.3 (przynajmniej w systemie Windows zawsze zwraca tę samą 6015
wartość). Próbowałem również zrobić to w sposób, który nie pozwoliłby zachować liczby dni w każdym miesiącu (rundy do 30), lat przestępnych itp .:
$seconds = ($delta->s)
+ ($delta->i * 60)
+ ($delta->h * 60 * 60)
+ ($delta->d * 60 * 60 * 24)
+ ($delta->m * 60 * 60 * 24 * 30)
+ ($delta->y * 60 * 60 * 24 * 365);
Ale naprawdę nie jestem zadowolony z używania tego niedoścignionego rozwiązania.
$delta->format("%r%s")
?format
polega na tym, że kiedy powiedzmy, że liczba sekund wynosi 0, a liczba minut wynosi 1,$delta->format("%r%s")
okazuje się, że wynosi 0 :(Odpowiedzi:
Czy nie mógłbyś zamiast tego porównać znaczników czasu ?
$now = new DateTime('now'); $diff = $date->getTimestamp() - $now->getTimestamp()
źródło
getTimestamp()
metoda jest dostępna w PHP> = 5.3.0.format('U')
zamiastgetTimestamp()
.Ta funkcja umożliwia uzyskanie całkowitego czasu trwania w sekundach z obiektu DateInterval
/** * @param DateInterval $dateInterval * @return int seconds */ function dateIntervalToSeconds($dateInterval) { $reference = new DateTimeImmutable; $endTime = $reference->add($dateInterval); return $endTime->getTimestamp() - $reference->getTimestamp(); }
źródło
$endTime
i$reference
nawzajem, ponieważ daje mi to wynik ujemny z przyszłą wartością daty i godziny w przedziale czasu.Możesz to zrobić tak:
$currentTime = time(); $timeInPast = strtotime("2009-01-01 00:00:00"); $differenceInSeconds = $currentTime - $timeInPast;
time () zwraca bieżący czas w sekundach od czasu epoki (1970-01-01T00: 00: 00), a strtotime robi to samo, ale na podstawie określonej daty / godziny, którą podasz.
źródło
static function getIntervalUnits($interval, $unit) { // Day $total = $interval->format('%a'); if ($unit == TimeZoneCalc::Days) return $total; //hour $total = ($total * 24) + ($interval->h ); if ($unit == TimeZoneCalc::Hours) return $total; //min $total = ($total * 60) + ($interval->i ); if ($unit == TimeZoneCalc::Minutes) return $total; //sec $total = ($total * 60) + ($interval->s ); if ($unit == TimeZoneCalc::Seconds) return $total; return false; }
źródło
Zawsze jest miło, gdy to, czego potrzebujesz, jest już obecne w klasie. W twoim przypadku potrzebujesz całkowitej liczby sekund. Dlaczego nie zrobić z tego zajęć? Kod mógłby wyglądać tak:
(new TotalFullSeconds( new IntervalFromRange( new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'), new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00') ) )) ->value()
Oprócz intuicyjności możesz także skorzystać z funkcji autouzupełniania swojego IDE.
Aby uzyskać bardziej przydatną implementację, możesz sprawdzić tę bibliotekę .
źródło
Możesz po prostu wpisać twarde liczby (zamiast 60 * 60 - wpisz 3600), aby nie musiał ich obliczać za każdym razem.
Edytuj - poprawiono liczbę na podstawie Twojego komentarza.
źródło