Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: gmmktime ja mktime, mitä eroa?

Sivun loppuun

Pentu [14.07.2014 23:12:51]

#

Mitä eroa on funktioilla gmmktime() ja mktime() ? Palauttavat 5h erilaiset ajat.


Testi ohjelmani:

<?php
$d = 1;		// Päivä
$m = 7;		// Kuukausi
$y = 2014;	// Vuosi

// säästetään näppäimiä, kuten aina
$br = "<br>\n";
												// 5h eroa (18 000sec)
$test_day1 = gmmktime( 0, 0, 0, $m, $d, $y);	// 1404172800 -> 27, 30.06.2014 19:06
$test_day2 = mktime(   0, 0, 0, $m, $d, $y); 	// 1404190800 -> 27, 01.07.2014 00:07
$testtoday = time();							// Nykyhetki

// TESTING
echo "TEST 1 : (". $test_day1 .") ". date('W, d.m.Y H:m', $test_day1) .$br;
echo "TEST 2 : (". $test_day2 .") ". date('W, d.m.Y H:m', $test_day2) .$br;
echo "TODAY  : (". $testtoday .") ". date('W, d.m.Y H:m', $testtoday) .$br;
?>

Kopioin netistä satunnaisesti jonkun löytämäni ohjelman pätkän projektia vaarten. Vähän niinkun malliksi. Ja tässä oli käytetty tuota gmmktime() -funktiota, eikä ohjelma toiminut aivan odotetusti. Testasin ohjelmaa tuolla mktime() -funktiolla ja vika korjaantui.

Lähdin vielä ihmettelemään testi ohjelman muodossa tätä.

Metabolix [14.07.2014 23:43:11]

#

Kuten dokumentaatiossa aika selvästi lukee, mktime olettaa, että antamasi luvut palvelimen ovat paikallista aikaa, kun taas gmmktime olettaa, että ne ovat GMT-aikaa. Voisit debuggaukseesi lisätä aikavyöhykkeen tulostuksen, niin näkisit, mitä ne ajat oikein ovat. Funktiossa mktime käytettävän aikavyöhykkeen voi asettaa funktiolla date_default_timezone_set.

vesikuusi [14.07.2014 23:44:27]

#

http://www.lmgtfy.com/?q=php mktime vs gmmktime

Myös PHP:n dokumentaatio voi auttaa.

Mutta koska tämä on foorumi, on mielestäni typerää ohjata kysyjä ulos sivustolta, joten

mktime ottaa huomioon paikallisen koneen aikavyöhykkeen. gmmktime ei. mktime suhteuttaa ajan paikalliseen aikaan, gmmktime suhteuttaa GMT-aikaan.

https://www.php.net/manual/en/function.gmmktime.php
https://www.php.net/manual/en/function.mktime.php

Lisäys: Oho, meatballs ehti ensin.

p99o [15.07.2014 00:03:35]

#

Nämä aikajutut ovat kyllä itsestänikin aika ärsyttäviä. joskus pääsee helpolla, mutta onhan niitä kun pitää muotoilla aikaleimoja, säätää aikavyöhykkeitä, kesäaikoja, hakea x tuntia vanhoja asiota yms. Pitäisi varmaan perehtyä tarkemmin joskus

The Alchemist [15.07.2014 09:01:11]

#

Totta kai ne ovat ärsyttäviä, koska php:ssä ei ole vakiona minkäänlaisia järkeviä työkaluja aikojen käpistelyyn.

Tukki [15.07.2014 10:23:54]

#

The Alchemist kirjoitti:

Totta kai ne ovat ärsyttäviä, koska php:ssä ei ole vakiona minkäänlaisia järkeviä työkaluja aikojen käpistelyyn.

Eikö? Onko DateTime luokkakin täysin hyödytön? Minkälaisia puutteita siinä on?

timoh [15.07.2014 11:21:04]

#

En minäkään heti keksi miksei DateTime (tai DateTimeImmutable) kelpaisi.

Kyseessä kuitenkin melkoisen hyvä MacGyver aikojen käsittelyyn.

Pentu [15.07.2014 15:22:12]

#

Aivan juu, eipä käynyt tällänen pikku seikka mielessä, tuo funkitoiden palauttama ero siis muuttuu aikavyöhykkeen muuttuessa.. Myös date_default_timezone_set -funktiosta on apua muuallakin kuin tässä :D

Metabolix kirjoitti:

Voisit debuggaukseesi lisätä aikavyöhykkeen tulostuksen, niin näkisit, mitä ne ajat oikein ovat.

Tuossa koodissahan se palauttaisi molemmille ajoille vain "-05:00", date() -funktio uskoakseni olettaa että annettu aika on default tz.

Elikkäs johtopäätelmä on, että mun tarvii käyttää gmmktime() funktion palauttamaan aikaleimaan gmdate() functiota, niin toimii kuten pitääkin.

Ja date() -funktio voisi toimia paremmin muodossa (Näytetään tuntien jälkeen kuitenkin ne minuutit):

date('W, d.m.Y H:i', $test_day2)

Kiitti vastauksista :)

Metabolix [15.07.2014 16:43:38]

#

Pentu kirjoitti:

Metabolix kirjoitti:

Voisit debuggaukseesi lisätä aikavyöhykkeen tulostuksen, niin näkisit, mitä ne ajat oikein ovat.

Tuossa koodissahan se palauttaisi molemmille ajoille vain "-05:00",

Totta, mutta ovelasti siitä voisi arvata sen jo todetun asian, että saamasi viiden tunnin aikaero johtuu aikavyöhykkeestä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta