sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag infoga realtid av en händelse i databasen med php mysqli?

Istället för att pilla med tidszoner, varför inte bara göra det

ALTER TABLE `your_table`
  CHANGE `date_added` `date_added`
  TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

Detta kommer att ändras din kolumn från en DATE-kolumn till en TIMESTAMP-kolumn , konverterar alla datum till sina respektive UTC-tidsstämplar i processen.

När en ny rad infogas kommer att använda den aktuella tidsstämpeln som ett värde . Tidsstämplar är alltid i UTC, så du behöver inte ändra tidszonen på din MySql-server och inte heller ange datum när du infogar en ny rad.

Om du inte kan eller vill inte ändra dina kolumner kan du också bara välja tidsstämpel via

SELECT UNIX_TIMESTAMP('date_added') FROM your_table;

För din TimeAgo kan du sedan bara göra

$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);

När du anger en tidsstämpel till DateTime kommer den alltid att använda UTC oavsett vilken servertidszon du har angett som standard. Följaktligen måste du antingen konvertera $dateAdded till standardtidszonen (som visas ovan) eller konvertera $timeSinceAdded till UTC.

För att ändra dateTime till den aktuella användarens tidszon, kan du antingen

I vilket fall som helst så ändrar du bara båda DateTimes till den tidszonen. Detta görs enkelt via setTimezone() .

$timeSinceAdded kommer då att vara ett DateInterval objekt, som du kan använda så här

echo $timeSinceAdded->format('%a total days');

Se länkarna för ytterligare information, till exempel om tillgängliga formatmodifierare.



  1. FEL:HHH000299:Kunde inte slutföra schemauppdatering java.lang.NullPointerException

  2. mysql:Kan vi inte skapa triggers på systemtabeller?

  3. MySQL fel nr 121

  4. mysql:mycket enkelt SELECT id ORDER BY LIMIT kommer inte att använda INDEX som förväntat (?!)