Zoeken…


Opmerkingen

Wanneer u tijdinformatie voor een wereldwijd gebruikersbestand in MySQL moet verwerken, gebruikt u het gegevenstype TIMESTAMP in uw tabellen.

Sla voor elke gebruiker een tijdzone-kolom met gebruikersvoorkeuren op. VARCHAR (64) is een goed gegevenstype voor die kolom. Wanneer een gebruiker zich registreert om uw systeem te gebruiken, vraagt u naar de tijdzonewaarde. De mijne is Atlantic Time, America/Edmonton . De jouwe kan Asia/Kolkata of Australia/NSW wel of niet zijn. Voor een gebruikersinterface voor deze gebruikersvoorkeuren heeft de WordPress.org-software een goed voorbeeld.

Ten slotte, telkens wanneer u een verbinding tot stand brengt vanuit uw hostprogramma (Java, php, wat dan ook) naar uw DBMS namens een gebruiker, geeft u de SQL-opdracht

 SET SESSION time_zone='(whatever tz string the user gave you)'

voordat u gebruikersgegevens verwerkt die betrekking hebben op tijden. Vervolgens worden alle TIMESTAMP tijden die u hebt geïnstalleerd zal maken in de lokale tijd van de gebruiker.

Hierdoor worden alle tijden die naar uw tabellen gaan, geconverteerd naar UTC en worden alle tijden die worden vertaald vertaald naar lokaal. Het werkt correct voor NOW () en CURDATE (). Nogmaals, u moet hiervoor TIMESTAMP gebruiken en niet de gegevenstypen DATETIME of DATE.

Zorg ervoor dat uw server-besturingssysteem en standaard MySQL-tijdzones zijn ingesteld op UTC. Als u dit niet doet voordat u begint met het laden van informatie in uw database, is het bijna onmogelijk om dit te verhelpen. Als u een leverancier gebruikt om MySQL uit te voeren, sta erop dat deze dit goed doen.

Haal de huidige datum en tijd op in een bepaalde tijdzone.

Dit haalt de waarde van NOW() in lokale tijd, in India Standard Time en vervolgens opnieuw in UTC.

SELECT NOW();
SET time_zone='Asia/Kolkata'; 
SELECT NOW();
SET time_zone='UTC'; 
SELECT NOW();

Converteer een opgeslagen `DATUM` of` DATETIME` waarde naar een andere tijdzone.

Als u een opgeslagen DATE of DATETIME (ergens in een kolom), is deze opgeslagen met betrekking tot een bepaalde tijdzone, maar in MySQL wordt de tijdzone niet opgeslagen met de waarde. Dus als u het naar een andere tijdzone wilt converteren, kunt u dat doen, maar u moet de oorspronkelijke tijdzone kennen. Met CONVERT_TZ() wordt de conversie uitgevoerd. Dit voorbeeld toont rijen verkocht in Californië in lokale tijd.

SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
  FROM sales
 WHERE state_sold = 'CA'

Haal opgeslagen `TIMESTAMP`-waarden op in een bepaalde tijdzone

Dit is echt gemakkelijk. Alle TIMESTAMP waarden worden opgeslagen in universele tijd en worden altijd geconverteerd naar de huidige time_zone instelling wanneer ze worden weergegeven.

SET SESSION time_zone='America/Los_Angeles'; 
SELECT timestamp_sold
  FROM sales
 WHERE state_sold = 'CA'

Waarom is dit? TIMESTAMP waarden zijn gebaseerd op het eerbiedwaardige gegevenstype UNIX time_t . Die UNIX-tijdstempels worden sinds 1970-01-01 00:00:00 UTC als een aantal seconden opgeslagen.

Merk op dat TIMESTAMP waarden worden opgeslagen in universele tijd. DATE en DATETIME waarden worden opgeslagen in welke lokale tijd van kracht was toen ze werden opgeslagen.

Wat is de lokale tijdzone-instelling van mijn server?

Elke server heeft een standaard globale tijdzone-instelling, geconfigureerd door de eigenaar van de servermachine. U kunt op deze manier de huidige tijdzone-instelling vinden:

SELECT @@time_zone

Helaas levert dat meestal de waarde SYSTEM , wat betekent dat de MySQL-tijd wordt bepaald door de tijdzone-instelling van het server-besturingssysteem.

Deze reeks vragen (ja, het is een hack ) geeft u de offset in minuten terug tussen de tijdzone-instelling van de server en UTC.

CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;

Hoe werkt dit? De twee kolommen in de tijdelijke tabel met verschillende gegevenstypen is de aanwijzing. DATETIME gegevenstypen worden altijd in lokale tijd opgeslagen in tabellen en TIMESTAMP s in UTC. Dus de INSERT instructie, uitgevoerd wanneer de tijdzone is ingesteld op UTC, slaat twee identieke datum / tijdwaarden op.

Vervolgens wordt de SELECT-instructie gedaan wanneer de tijdzone is ingesteld op lokale servertijd. TIMESTAMP s worden altijd vertaald uit hun opgeslagen UTC-formulier naar lokale tijd in SELECT-instructies. DATETIME s niet. Dus de TIMESTAMPDIFF(MINUTE...) bewerking berekent het verschil tussen lokale en universele tijd.

Welke waarden voor tijdzone zijn beschikbaar op mijn server?

Gebruik deze opdracht om een lijst met mogelijke tijdzone-waarden in uw MySQL-serverinstantie te krijgen.

 SELECT mysql.time_zone_name.name

Gewoonlijk toont dit de ZoneInfo-lijst van tijdzones die door Paul Eggert worden onderhouden bij de Internet Assigned Numbers Authority . Wereldwijd zijn er ongeveer 600 tijdzones.

Unix-achtige besturingssystemen (bijvoorbeeld Linux-distributies, BSD-distributies en moderne Mac OS-distributies) ontvangen routinematige updates. Door deze updates op een besturingssysteem te installeren, kunnen de MySQL-instanties die daar actief zijn de veranderingen in de tijdzone en de zomertijd / standaardtijdomschakelingen volgen.

Als u een veel kortere lijst met tijdzonenamen krijgt, is uw server onvolledig geconfigureerd of draait deze op Windows. Hier zijn instructies voor uw serverbeheerder om de ZoneInfo-lijst te installeren en te onderhouden.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow