Sök…


Anmärkningar

När du behöver hantera tidsinformation för en världsomspännande användarbas i MySQL använder du datatypen TIMESTAMP i dina tabeller.

För varje användare, lagra en tidszonskolumn för användarinställningar. VARCHAR (64) är en bra datatyp för den kolumnen. När en användare registrerar sig för att använda ditt system, fråga efter tidszonvärdet. Min är Atlantic Time, America/Edmonton . Dina kanske eller kanske inte är Asia/Kolkata eller Australia/NSW . För ett användargränssnitt för den här inställningen för användare har WordPress.org-programvaran ett bra exempel.

Slutligen, när du upprättar en anslutning från ditt värdprogram (Java, php, vad som helst) till ditt DBMS för en användares vägnar, utfärda SQL-kommandot

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

innan du hanterar användardata som involverar tider. Då kommer alla TIMESTAMP tider som du har installerat att visas i användarens lokala tid.

Detta kommer att göra att alla tider som går in i dina tabeller konverteras till UTC och alla tider som kommer att översättas till lokala. Det fungerar korrekt för NU () och CURDATE (). Återigen måste du använda TIMESTAMP och inte DATETIME eller DATE-datatyper för detta.

Se till att din server OS och standard MySQL-tidszoner är inställd på UTC. Om du inte gör det innan du börjar ladda information i din databas kommer det att vara nästan omöjligt att fixa. Om du använder en leverantör för att köra MySQL, insisterar de på att de har rätt.

Hämta aktuellt datum och tid i en viss tidszon.

Detta hämtar värdet på NOW() i lokal tid, i India Standard Time och sedan igen i UTC.

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

Konvertera ett lagrat värde 'DATE' eller 'DATETIME' till en annan tidszon.

Om du har en lagrad DATE eller DATETIME (i en kolumn någonstans) lagrades den med avseende på viss tidszon, men i MySQL lagras inte tidszonen med värdet. Så om du vill konvertera den till en annan tidszon kan du, men du måste känna till den ursprungliga tidszonen. CONVERT_TZ() använder CONVERT_TZ() gör konverteringen. Detta exempel visar rader som sålts i Kalifornien i lokal tid.

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

Hämta lagrade "TIMESTAMP" -värden i en viss tidszon

Det här är väldigt enkelt. Alla TIMESTAMP värden lagras i universell tid och konverteras alltid till inställningen för närvarande time_zone närhelst de återges.

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

Varför är detta? TIMESTAMP värden är baserade på den värdefulla UNIX time_t . Dessa UNIX-tidsstämplar lagras som ett antal sekunder sedan 1970-01-01 00:00:00 UTC.

Observera TIMESTAMP värden lagras i universell tid. DATE och DATETIME värden lagras under vilken lokal tid som gällde när de lagrades.

Vad är min servers lokala tidszoninställning?

Varje server har en standardinställning för global tidszon som är konfigurerad av ägaren till servern. Du kan ta reda på den aktuella tidszoninställningen på detta sätt:

SELECT @@time_zone

Tyvärr ger det vanligtvis värdet SYSTEM , vilket betyder att MySQL-tiden styrs av server OS: s tidszoninställning.

Denna sekvens av frågor (ja, det är en hack ) ger dig tillbaka förskjutningen på några minuter mellan serverns tidszoninställning och 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;

Hur fungerar detta? De två kolumnerna i den temporära tabellen med olika datatyper är ledtråden. DATETIME datatyper lagras alltid i lokal tid i tabeller och TIMESTAMP i UTC. Så INSERT uttalandet, som utförs när tidszonen är inställd på UTC, lagrar två identiska datum / tidsvärden.

Sedan görs SELECT-uttalandet när tidszonen är inställd på server lokal tid. TIMESTAMP er översätts alltid från sin lagrade UTC-formulär till lokal tid i SELECT-uttalanden. DATETIME är inte. Så TIMESTAMPDIFF(MINUTE...) beräknar skillnaden mellan lokal och universell tid.

Vilka tidszonvärden finns tillgängliga på min server?

Använd det här kommandot för att få en lista med möjliga värden för tidszoner i din MySQL-serverinstans.

 SELECT mysql.time_zone_name.name

Vanligtvis visar detta ZoneInfo-listan över tidszoner som Paul Eggert upprätthåller på Internet Assigned Numbers Authority . I hela världen finns det ungefär 600 tidszoner.

Unix-liknande operativsystem (Linux-distributioner, BSD-distributioner och moderna Mac OS-distributioner, till exempel) får rutinuppdateringar. Genom att installera dessa uppdateringar på ett operativsystem kan MySQL-instanser som kör där spåra förändringarna i tidszon och dagsljus / standardtidsövergångar.

Om du får en mycket kortare lista över tidszonnamn är din server antingen ofullständigt konfigurerad eller körs på Windows. Här är instruktioner för din serveradministratör för att installera och underhålla ZoneInfo-listan.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow