Avatar billede apromis Praktikant
10. august 2010 - 22:31 Der er 18 kommentarer og
1 løsning

Er da ved at gå amok ! - Mktime giver forkert resultat

Hej allesammen.

Er ved at gå fuldstændig amok. Mktime regner ikke rigtigt :(.

Se denne her :
echo "dag " .$_POST["dag"] ." maned" .$_POST["maaned"] ." aar" .$_POST["aar"] ."SPLIT";
echo "dato" .$tid;

Giver :
dag 10 maned8 aar2010SPLITdato1281484740Next : 1281484740nexxxx

LAver så denne kode :
$tal = mktime (23,59,00,$maaned,$dag,$aar);
Som giver resultat :
1281484740 som faktisk svarer til den 11-Aug-2010 kl 1:59:00

Det vil sige den 10 august 2010.
Hvis jeg laver en mktime på 23:59:00 10 august 2010 får jeg denne værdi (er prøvet omregnet som giver korrekt værdi) :
1281477540

Hvorfor regner min kode 2 timer forkert ?
På forhånd tak
Avatar billede arne_v Ekspert
10. august 2010 - 22:36 #1
Proev og saet din tidszone til Danmark. Det ligner et DK versus GMT problem.
Avatar billede majbom Novice
10. august 2010 - 22:37 #2
måske noget med at tidszonen på serveren ikke er den samme som du sidder i?
Avatar billede majbom Novice
10. august 2010 - 22:37 #3
nej jeg er langsom i dag :)
Avatar billede apromis Praktikant
10. august 2010 - 22:40 #4
Du har ganske ret. HAr oploadet til serveren og det virker her.
Så mit problem ligger faktisk i javascriptet ikke kører i samme zone :(.

Hvad kan man gøre ved det ?
Avatar billede apromis Praktikant
10. august 2010 - 22:41 #5
function mktime() {
    // http://kevin.vanzonneveld.net
    // +  original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +  improved by: baris ozdil
    // +      input by: gabriel paderni
    // +  improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +  improved by: FGFEmperor
    // +      input by: Yannoo
    // +  bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: jakes
    // +  bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +  bugfixed by: Marc Palau
    // +  improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: 3D-GRAF
    // +  bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Chris
    // +    revised by: Theriault
    // %        note 1: The return values of the following examples are
    // %        note 1: received only if your system's timezone is UTC.
    // *    example 1: mktime(14, 10, 2, 2, 1, 2008);
    // *    returns 1: 1201875002
    // *    example 2: mktime(0, 0, 0, 0, 1, 2008);
    // *    returns 2: 1196467200
    // *    example 3: make = mktime();
    // *    example 3: td = new Date();
    // *    example 3: real = Math.floor(td.getTime() / 1000);
    // *    example 3: diff = (real - make);
    // *    results 3: diff < 5
    // *    example 4: mktime(0, 0, 0, 13, 1, 1997)
    // *    returns 4: 883612800
    // *    example 5: mktime(0, 0, 0, 1, 1, 1998)
    // *    returns 5: 883612800
    // *    example 6: mktime(0, 0, 0, 1, 1, 98)
    // *    returns 6: 883612800
    // *    example 7: mktime(23, 59, 59, 13, 0, 2010)
    // *    returns 7: 1293839999
    // *    example 8: mktime(0, 0, -1, 1, 1, 1970)
    // *    returns 8: -1
    var d = new Date(), r = arguments, i = 0,
        e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear'];

    for (i = 0; i < e.length; i++) {
        if (typeof r[i] === 'undefined') {
            r[i] = d['get' + e[i]]();
            r[i] += (i === 3); // +1 to fix JS months.
        } else {
            r[i] = parseInt(r[i], 10);
            if (isNaN(r[i])) {
                return false;
            }
        }
    }
   
    // Map years 0-69 to 2000-2069 and years 70-100 to 1970-2000.
    r[5] += (r[5] >= 0 ? (r[5] <= 69 ? 2e3 : (r[5] <= 100 ? 1900 : 0)) : 0);
   
    // Set year, month (-1 to fix JS months), and date.
    // !This must come before the call to setHours!
    d.setFullYear(r[5], r[3] - 1, r[4]);
   
    // Set hours, minutes, and seconds.
    d.setHours(r[0], r[1], r[2]);

    // Divide milliseconds by 1000 to return seconds and drop decimal.
    // Add 1 second if negative or it'll be off from PHP by 1 second.
    return (d.getTime() / 1e3 >> 0) - (d.getTime() < 0);
}
Avatar billede erikjacobsen Ekspert
10. august 2010 - 22:51 #6
Du bruger noget dato-helløj sat af javascript i brugerens browser?? Du kan jo aldrig hvilken tidszone bruger anvender, men du kan få det at vide. Se fx

  alert(new Date());

Deraf kan du udtrække tidszonen. (Og hvis det er meget vigtigt, så husk at brugeren kan snyde dig)
Avatar billede apromis Praktikant
10. august 2010 - 22:58 #7
Altså der bliver kørt et tjek i php efterfølgende så det ikke super vigtigt.
Men vil gerne have denne service til mine brugere.
Hvordan vil du gøre det ?
    var d = new Date(), r = arguments, i = 0,

replacere newdate og fjerner 60*60*2 ?
Avatar billede erikjacobsen Ekspert
10. august 2010 - 23:01 #8
Hvad skal du bruge det til? Og hvorfor aflæse dato på brugerens maskine med javascript?
Avatar billede apromis Praktikant
10. august 2010 - 23:03 #9
Altså hvis den kan læse serveren istedet ville det være endnu bedre :) ?
Avatar billede erikjacobsen Ekspert
10. august 2010 - 23:06 #10
Det kommer sådan set an på hvad du skal bruge det til.
Avatar billede apromis Praktikant
10. august 2010 - 23:09 #11
Min kode udregner sekunder efter 1970 udfra nogle selectbokse på tidspunktet 23,59,00 på denne dag.

var m1 = document.data.dag.options[document.data.dag.selectedIndex].value;
var m2 = document.data.maaned.options[document.data.maaned.selectedIndex].value;
var m3 = document.data.aar.options[document.data.aar.selectedIndex].value;
var tidSubmittedDate = mktime(23, 59, 00, m2, m1, m3);
if (oHash[tidSubmittedDate]) {
var textstring = "Der er allerede udfyldt data for denne dato. Brug menuen for komme tilbage, og dermed rette indtastningen for denne dato.";
alert (textstring); 
  }

jeg bruger ovenstående postet kode til at udregne det med i javascript :)
Avatar billede apromis Praktikant
10. august 2010 - 23:10 #12
Hov og hashen er udskrevet fra php med f.eks dette output :
var oHash = {"1280966340":1,"1281311940":1,"1281484740":1};
Avatar billede erikjacobsen Ekspert
10. august 2010 - 23:16 #13
Nu kan du aldrig regne med at en brugers tidsangivelse på hans maskine passer. Så find alle data på serveren, også dags dato. Og så kan du bare gøre det med datoen, ikke et timestamp.
Avatar billede apromis Praktikant
10. august 2010 - 23:18 #14
Jamen hvordan vil du gøre det ?
Kender ikke ret meget til javascript :(

Er det her den tager fra brugerens maskine :
    var d = new Date(), r = arguments, i = 0,
        e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear'];

Eller loader den fra sendte ?
Avatar billede majbom Novice
11. august 2010 - 07:43 #15
javascript henter dato fra klienten og php henter dato fra serveren - færdig slut!
Avatar billede apromis Praktikant
11. august 2010 - 07:45 #16
Pis :).

Arne pointsne må være dine.
Avatar billede arne_v Ekspert
12. august 2010 - 03:53 #17
svar
Avatar billede arne_v Ekspert
12. august 2010 - 03:54 #18
Hvis du vil bruge serverens tid i JavaScript client side, så outputter du noget JavaScript som sætter tiden til serverens tid (konstant i JavaScript, variabel i PHP).
Avatar billede arne_v Ekspert
26. september 2010 - 21:07 #19
så mangler du bare at acceptere svaret
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester