Alla fyndtips från mellandagsrean
Permalänk
Medlem

GMT till svensk tid

Hej!

Jag sparar tidpunkt för alla inlägg med följande kod:

$query_autonow = "INSERT INTO dateplayground (dp_name, dp_datetime, pid) VALUE ('DATETIME: Auto NOW()', NOW(), '$h_id')"; mysql_query($query_autonow) or die(mysql_error());

Jag får tiden i GMT men vill ha den i svensk tid. Har googlat lite och hittat följande rad:

date_default_timezone_set("Europe/Stockholm");

Men hur ska jag hantera den??

Permalänk
Medlem
Skrivet av Revery:

Hej!

Jag sparar tidpunkt för alla inlägg med följande kod:

$query_autonow = "INSERT INTO dateplayground (dp_name, dp_datetime, pid) VALUE ('DATETIME: Auto NOW()', NOW(), '$h_id')"; mysql_query($query_autonow) or die(mysql_error());

Jag får tiden i GMT men vill ha den i svensk tid. Har googlat lite och hittat följande rad:

date_default_timezone_set("Europe/Stockholm");

Men hur ska jag hantera den??

Om det är någon form av tidsstämplar så låter det rimligt att spara dessa i UTC (i princip samma sak som GMT) och att sedan istället konvertera till valfri tidszon när data skall visas upp.

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || Sapphire Pulse RX 7900 XTX || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

kan du inte bara ta värdet du får av GMT och lägga till en timma på det? (GMT+1)

Visa signatur

MODERMODEM: Asus ROG Strix Z270E Gaming | i7 7700K | Corsair Hydro H110 | Kingston HyperX Savage 32GB DDR4 RAM | Asus GeForce RTX 3060 Ti TUF OC | Crucial BX100 500GB SSD | Phanteks Enthoo EVOLV | SilverStone Strider Evolution 1200W |

Permalänk
Medlem
Skrivet av morxy49:

kan du inte bara ta värdet du får av GMT och lägga till en timma på det? (GMT+1)

Om man vill in och ändra i koden två gånger per år så

Visa signatur

DAN Cases A4-SFX | AMD Ryzen 7 9800X3D | Thermalright AXP90-X47 Full Copper |
INNO3D GeForce RTX 4070 Ti SUPER 16GB Twin X2 | Kingston 32GB (2x16GB) DDR5 6000MHz CL30 | ASUS ROG Strix B650E-I Gaming WIFI | Samsung 960 EVO 1TB | Corsair SF-600

Permalänk
Medlem
Skrivet av Nioreh83:

Om man vill in och ändra i koden två gånger per år så

varför skulle det behövas? det är ju alltid GMT+1 i sverige?

Visa signatur

MODERMODEM: Asus ROG Strix Z270E Gaming | i7 7700K | Corsair Hydro H110 | Kingston HyperX Savage 32GB DDR4 RAM | Asus GeForce RTX 3060 Ti TUF OC | Crucial BX100 500GB SSD | Phanteks Enthoo EVOLV | SilverStone Strider Evolution 1200W |

Permalänk
Medlem

Ja, det har du rätt i, men hur gör jag det? Den här koden använder jag vid visning av nyaste bilden.

$query = "SELECT nsm_image.img_name, dateplayground.dp_id, dateplayground.dp_datetime FROM nsm_image INNER JOIN dateplayground ON nsm_image.dp_id = dateplayground.dp_id ORDER BY dp_id DESC LIMIT 1"; $result = mysql_query($query); while($array = mysql_fetch_array($result, MYSQL_ASSOC)) { $img_name=$array['img_name']; $dp_datetime=$array['dp_datetime']; echo "<p class=v1>Bilden uppladdad: " . $array['dp_datetime'] . "<br />"; echo "<img src=upload/" . $array['img_name'] . "><br />"; }

Permalänk
Medlem
Skrivet av morxy49:

varför skulle det behövas? det är ju alltid GMT+1 i sverige?

Sommar och vintertid.

Permalänk
Medlem
Skrivet av morxy49:

varför skulle det behövas? det är ju alltid GMT+1 i sverige?

Ja men vi har sommar- och vintertid.

Visa signatur

Define R4 / 4770k / Hydro H80i / Gigabyte GTX 760 / MSI Z87-G45 / A-Data 8GB 1600 MHz / EVO Basic 250GB / 3TB Seagate / Corsair 750W RM 80+ Gold Modular / BenQ 21.5" 1920x1080 x3

Permalänk
Medlem
Skrivet av Raz159:

Sommar och vintertid.

Skrivet av cSx:

Ja men vi har sommar- och vintertid.

haha, just det ja

Visa signatur

MODERMODEM: Asus ROG Strix Z270E Gaming | i7 7700K | Corsair Hydro H110 | Kingston HyperX Savage 32GB DDR4 RAM | Asus GeForce RTX 3060 Ti TUF OC | Crucial BX100 500GB SSD | Phanteks Enthoo EVOLV | SilverStone Strider Evolution 1200W |

Permalänk
Medlem

Precis! GMT har inte sommartid och jag vill inte gå in och ändra två gånger per år. Men tack för förslaget i alla fall!

Permalänk
Medlem
Permalänk
Medlem
Skrivet av cSx:

Ja men vi har sommar- och vintertid.

Du menar förstås "nej", inte "ja". Vi är UTC+2 på sommaren (i princip GMT+2 m.a.o.).

GMT är i princip britternas normaltid, de har BST på sommaren.

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || Sapphire Pulse RX 7900 XTX || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Haha! Got the message era909!
Att lägga in den svenska tiden var steg ett. Sedan trodde jag att man kunde göra om det till en variabel så varje dator kunde tala om vilken tidszon den tillhörde och därför få rätt, förlåt sin egen, tid.
Min sida riktar sig till svensktalande publik, både äldre och yngre, så jag tror att jag kommer att få ett antal meddelande om att tiden anges fel. Får väl skriva att det är GMT/UTC-tid som anges.
Om ingen har en bättre lösning!

Permalänk
Medlem

haha, tack för ett gott skratt

Visa signatur

MODERMODEM: Asus ROG Strix Z270E Gaming | i7 7700K | Corsair Hydro H110 | Kingston HyperX Savage 32GB DDR4 RAM | Asus GeForce RTX 3060 Ti TUF OC | Crucial BX100 500GB SSD | Phanteks Enthoo EVOLV | SilverStone Strider Evolution 1200W |

Permalänk
Medlem
Skrivet av Revery:

Haha! Got the message era909!
Att lägga in den svenska tiden var steg ett. Sedan trodde jag att man kunde göra om det till en variabel så varje dator kunde tala om vilken tidszon den tillhörde och därför få rätt, förlåt sin egen, tid.
Min sida riktar sig till svensktalande publik, både äldre och yngre, så jag tror att jag kommer att få ett antal meddelande om att tiden anges fel. Får väl skriva att det är GMT/UTC-tid som anges.
Om ingen har en bättre lösning!

Såg ut som att det handlade om PHP så något i stil med http://simonholywell.com/post/2013/12/convert-utc-to-local-ti...?

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || Sapphire Pulse RX 7900 XTX || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Du menar förstås "nej", inte "ja". Vi är UTC+2 på sommaren (i princip GMT+2 m.a.o.).

Haha, självklart menade jag det.

Visa signatur

Define R4 / 4770k / Hydro H80i / Gigabyte GTX 760 / MSI Z87-G45 / A-Data 8GB 1600 MHz / EVO Basic 250GB / 3TB Seagate / Corsair 750W RM 80+ Gold Modular / BenQ 21.5" 1920x1080 x3

Permalänk
Avstängd

Är ganska säker på att det finns API:er för just detta.

Visa signatur
Permalänk
Medlem

Just det evil penguin! Den koden visar tiden, men hur får jag in den i scriptet? Kanske är för trött nu, får sova på saken!

Permalänk
Hedersmedlem

Han tog inte upp Sverige som borde ha ett hedersomnämnande i att krångla med datum.

När vi skulle gå från den julianska till den gregorianska kalendern i början på 1700-talet så gjorde vi inte som de flesta andra länder och bara hoppade över en massa dagar så att vi kom i synk direkt. Vi valde att i stället sköta övergången genom att skippa skottdagar under en 40-årsperiod. Det gjordes ett skottår, men nästa gång det var dags så låg vi i krig, och "glömde" bort det, två (!) gånger i rad.

Uppenbarligen var det ett jobbigt projekt, så då bestämde vi i stället att "äsch, vi går tillbaka till den gamla kalendern igen", men då låg vi ju en dag före (pga det där året då vi kom ihåg att skippa skottdagen). För att fixa det så lade vi till en extra skottdag 1712, så att vi faktiskt "firade" den 30 februari. Så alla som hårdkodat att februari alltid har 28 dagar, eller eventuellt 29 (om året är jämnt delbart med 4, men inte med 100, eller jo: om det också är delbart med 400) har inte tänkt på de stackars 1700-talssvenskarna.

Efterhand märkte vi dock att det ändå vore bra att gå över till den nya kalendern, så då gjorde vi som alla andra och hoppade över en mängd dagar på en gång ändå, och gick från 1753-02-17 direkt till 1753-03-01. Succé.

Summerat så handlar det som han säger om att alltid använda färdiga bibliotek och funktioner. Även då kan det finnas oväntade överraskningar: My First BillG Review [Joel on software], Why is subtracting these two times (in 1927) giving a strange result? [SO], men jag skulle ofta argumentera för att om man ens någon gång känner att man vill implementera egen skottårsräkning, eller definiera hur många dagar det är i en viss månad, så gör man "fel", någonstans, i någon mån (man får göra det, men då måste man veta att det inte är rekommenderat, och varför man frångår detta ändå; det är egentligen bara okunskap som är "fel").

Mer relaterat, så hanteras datum vanligen genom att sätta date.timezone i `php.ini` och se till att använda korrekta datatyper när man hanterar datum. MySQL:s `timestamp` konverterar automatiskt alla inkomna datum till UTC från serverns angivna tidszon, och konverterar tillbaka till serverns tidszon när datan hämtas. `datetime` lagrar data i serverns tidszon och utför inte någon konvertering. Så länge inte databasserverns egen tidszon ändras på felaktiga sätt så ska båda sakerna "bara fungera" ™. Se 11.3.1 The DATE, DATETIME, and TIMESTAMP Types i manualen.

Att du får fel tidszon i output låter antingen som att databasservern är inställd på fel tidszon, vilket då antingen betyder att du explicit satt fel tidszon i en conffil (osannolikt) eller att ditt system inte är inställt på rätt tidszon (vore också märkligt, om det nu inte handlar om någon shared hosting-lösning någon annanstans i världen). Alternativt så är det PHP som försöker vara smart och konvertera datumet till sin egen tidszon, men eftersom du inte har satt någon sådan korrekt i `php.ini` så ger den UTC. Du bör få en varning av PHP varje gång du använder datumfunktioner om du inte satt tidszonen explicit, men du kanske har stängt av varningar (vilket många gör när de utvecklar, vilket är kontraproduktivt).

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Vilka svar man får!!! Intressant, tack.
Men tillbaka till frågan. Nu hamnar vi i gråzon för min kunskap.
Så här såg det ut i php.ini:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = UTC

Jag bytte ut UTC mot:

"Europe/Stockholm" och även
"Europe/Amsterdam"

Startade om Apache - och hela datorn, men ingen skillnad. Vad göra?

Permalänk
Hedersmedlem
Skrivet av Revery:

Vilka svar man får!!! Intressant, tack.
Men tillbaka till frågan. Nu hamnar vi i gråzon för min kunskap.
Så här såg det ut i php.ini:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = UTC

Jag bytte ut UTC mot:

"Europe/Stockholm" och även
"Europe/Amsterdam"

Startade om Apache - och hela datorn, men ingen skillnad. Vad göra?

"Europe/Stockholm" låter bra, låt det vara så. Det ska räcka med att starta om Apache för att ta ny PHP-konfiguration i bruk.

Testade du att lägga till nya databasinlägg med försöka återge dessa datum? De som redan är lagrade kanske behöver uppdateras manuellt om de registrerats under felaktiga inställningar (låter inte helt säkert, men inget jag skulle utesluta).

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Ja, Stockholm får det bli.
Jag provade med att bara starta om Apache men det hjälpte inte så jag tog hela datorn. Av samma anledning testade jag Amsterdam också.
Och ja, jag la till helt nya, i det här fallet, bilder. UTC-tid både i tabellen och vid visning av bilden.
Gamla inlägg kvittar, är bara på test-stadiet ännu.

Permalänk
Hedersmedlem
Skrivet av Revery:

Ja, Stockholm får det bli.
Jag provade med att bara starta om Apache men det hjälpte inte så jag tog hela datorn. Av samma anledning testade jag Amsterdam också.
Och ja, jag la till helt nya, i det här fallet, bilder. UTC-tid både i tabellen och vid visning av bilden.
Gamla inlägg kvittar, är bara på test-stadiet ännu.

Skriv ut koden både för hur tiden skickas in i databasen (vilket du redan har gjort) och hur du presenterar den i PHP. Problematiken kanske ligger i att du låter MySQL generera datumet som lagras, men PHP hantera datumet som presenteras. Jag kan tänka mig att det kan finnas någon fälla där, där ena sidan applicerar en tidszonsregel men inte den andra. En tanke är att tidszonsinformationen helt enkelt är felinställd på databasservern, men jag vet som sagt inte hur det skulle ske på ett sätt som inte också skulle påverka PHP och systemet i stort, eller varför den blivit så till att börja med. Kan vara värt att undersöka i nästa steg, dock.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Koderna finns i inlägg 1 och 6.
Har sidan på one.com
Har även en gästbok där koderna ser ut som följer, förenklat:

<form method=post action=add_entry.php> <textarea name=dtl rows=5 cols=47></textarea> <input type=submit value='Skicka'>

I add_entry.php:

{ $tm=time(); // reading the time of entry // adding data to mysql database $rt=mysql_query("insert into guest_book(name,tm,dtl) values('$name','$tm','$dtl')"); echo mysql_error(); }

$query=mysql_query("SELECT * FROM guest_book WHERE id=$id ORDER BY tm desc"); while($nt=mysql_fetch_array($query)) { $dt=date("Y-m-d H:i",$nt['tm']); // formating the date echo "<p class=v1>Skrivet av: $nt[name]</p>"; echo "<p class=v1>Datum: $dt</p>"; echo "<p class=v1>$dtl</p>"; }

Permalänk
Hedersmedlem
Skrivet av Revery:

$tm=time(); $rt=mysql_query("insert into guest_book(name,tm,dtl) values('$name','$tm','$dtl')");

`time()` ger Unix-tid, vilket är tidszonsoberoende. Så MySQL-servern kommer internt lagra tiden i den tidszon den föredrar. Kontrollfråga: vilken datatyp är ditt MySQL-fält satt till att vara? `DATETIME`, eller något annat?

(Samvetet bör också notera att din kod är vidöppen för SQL injectiondu bör använda `mysqli` eller PDO i stället för `mysql`.)

Skrivet av Revery:

$dt=date("Y-m-d H:i",$nt['tm']);

Om tidszonen i PHP är rätt inställd så kommer PHP använda den för att omvandla Unix-tid till givet format. Exempel på mitt system:

$ php -r '$time = time(); echo $time."\n".date("U", $time)."\n".date("c", $time)."\n";' 1394002322 1394002322 2014-03-05T07:52:02+01:00

Det visar att `time()` ger Unix-tid, att `date()` formaterat som Unix-tid inte ändrar något på detta, och att `date()` formaterat som "vanlig tid" (ISO 8601) förstår den tidszonsinformation som konfigurerats i PHP.

Testa att göra samma utskrifter i ditt program (de tre jag visar i kodstycket ovan), fast med ditt `$nt['tm']` som input, så att du ser i vilket format MySQL levererar tiden, vilken Unix-tid som PHP anser att det motsvarar samt vilken tidszonstransformation som PHP applicerar. Ifall Unix-tiden i steg 2 är rätt, men PHP skriver fel i steg 3 ("+00:00"): då är det i PHP problemet ligger. Ifall Unix-tiden redan i steg 2 är fel och PHP skriver rätt enligt bästa förmåga, med tidszonsinformation: då är det i databasen, eller kopplingen till databasen, som något är fel.

Liveklocka med Unix-tid för att jämföra.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Tack för påpekandet om säkerheten. Jag vill få allt att fungera innan jag fördjupar mig i det, måste läsa på en hel del där.
Ja, det är Datetime.
Det blir UTC-tiden på alla ställen.

Permalänk
Hedersmedlem
Skrivet av Revery:

Tack för påpekandet om säkerheten. Jag vill få allt att fungera innan jag fördjupar mig i det, måste läsa på en hel del där.
Ja, det är Datetime.
Det blir UTC-tiden på alla ställen.

Då är det PHP som inte är med på rätt tidszon.

Skapa en PHP-fil som innehåller

<?=phpinfo()?>

och ladda den i webbläsaren. Sök efter avsnittet `date` och se vad det står. Du kan ta en skärmbild och posta hela `date`-stycket här om du vill; det som främst är av intresse är `Default timezone` och `date.timezone`.

EDIT: Glömde funktionsparanteserna i mitt exempelkommando, fixat.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Känns rätt för mig!?

date
date/time support enabled
"Olson" Timezone Database Version 2012.2
Timezone Database internal
Default timezone Europe/Stockholm

Directive Local Value Master Value
date.default_latitude 31.7667 31.7667
date.default_longitude 35.2333 35.2333
date.sunrise_zenith 90.583333 90.583333
date.sunset_zenith 90.583333 90.583333
date.timezone Europe/Stockholm Europe/Stockholm

Permalänk
Hedersmedlem

Testa först att skapa en helt ny fil, `test.php`, med innehåll:

<?php $time = time(); ?> <pre> <?=$time?> <?=date("U", $time)?> <?=date("c", $time)?> <?=date_default_timezone_get()?> </pre> <hr> <?=phpinfo()?>

och kontrollera vad du får. Klistra in utskrifterna innan den stora `phpinfo()`-härvan här, exempelvis:

1395903246 1395903246 2014-03-27T07:54:06+01:00 Europe/Stockholm

Kör du egen server eller "shared hosting"? Vilken PHP-version kör du (visas i rubriken i `phpinfo()`)?

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem

Vilket engagemang! Tack för det!

Så här ser det ut på min dator, med wamp-server:

1395947100
1395947100
2014-03-27T20:05:00+01:00
Europe/Stockholm

PHP Version 5.4.3

På one.com ser det ut så här:

1395947419
1395947419
2014-03-27T19:10:19+00:00
UTC

PHP Version 5.3.28

Jag kör allt på one.com. På wamp får jag en del felmeddelande gällande databasen och sökvägar och jag har inte brytt mig om att rätta dem. På one.com fungerar de.