Zamiast bawić się strefami czasowymi, dlaczego po prostu tego nie zrobić
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
To się zmieni Twoja kolumna z kolumny DATE do kolumny TIMESTAMP , konwertując w trakcie wszystkie daty na ich odpowiednie sygnatury czasowe UTC.
Po wstawieniu nowego wiersza użyje bieżącego znacznika czasu jako wartość . Znaczniki czasu są zawsze w UTC, więc nie musisz zmieniać strefy czasowej na serwerze MySql ani podawać daty podczas wstawiania nowego wiersza.
Jeśli nie możesz lub nie chcesz zmienić swoich kolumn, możesz po prostu wybrać znacznik czasu za pomocą
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Dla Twojego TimeAgo możesz po prostu zrobić
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Gdy podasz znacznik czasu do DateTime, zawsze użyje on czasu UTC, niezależnie od ustawionej domyślnej strefy czasowej serwera. W związku z tym musisz przekonwertować $dateAdded
do domyślnej strefy czasowej (jak pokazano powyżej) lub przekonwertuj $timeSinceAdded
do UTC.
Aby zmienić datę i godzinę na strefę czasową aktualnie odwiedzanego użytkownika,
- musisz mieć te informacje w swojej bazie danych, np. ponieważ prosisz zarejestrowanych użytkowników o podanie tych informacji
- lub określasz to w czasie wykonywania, zwykle poprzez wyszukiwanie GeoIP na IP odwiedzającego użytkownika lub wysyłając przesunięcie daty i godziny z przeglądarki użytkownika.
W każdym razie po prostu zmień oba DateTimes na tę strefę czasową. Można to łatwo zrobić za pomocą setTimezone()
.
$timeSinceAdded
będzie to DateInterval
obiekt, którego możesz użyć w ten sposób
echo $timeSinceAdded->format('%a total days');
Proszę zapoznać się z linkami, aby uzyskać więcej informacji, na przykład na temat dostępnych modyfikatorów formatu.