[HELP] Unixtime Konvertieren in gängiges Format

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo.
    Ich habe hier nen kleinen Timeban-Fail.
    Undzwar hatte ich damals mal eine Unixtime-Convert Funktion welche einen Unix-Timestamp in ein Datum & Uhrzeit umgewandelt hat.
    Wenn ich nun die Funktion verwende:

    Spoiler anzeigen


    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2;

    Spoiler anzeigen
    timestamp2 = second + (minute * 60) + (hour * 3600);

    Spoiler anzeigen
    new days_of_month[12];

    Spoiler anzeigen
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) {
    days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31}; // Schaltjahr
    } else {
    days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31}; // keins
    }
    new days_this_year = 0;
    days_this_year = day;
    if(month > 1) { // No January Calculation, because its always the 0 past months
    for(new i=0; i<month-1;i++) {
    days_this_year += days_of_month[i];
    }
    }
    timestamp2 += days_this_year * 86400;

    Spoiler anzeigen
    for(new j=1970;j<year;j++) {
    timestamp2 += 31536000;
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp2 += 86400; // Schaltjahr + 1 Tag
    }

    Spoiler anzeigen
    return timestamp2;
    }

    Spoiler anzeigen
    stock ConvertUnix(zeitpunkt, &hour, &minute, &second, &day, &month, &year)
    {
    new h = 0, m = 0, s = 0, da = 1, mo = 1, ye = 1970;
    for(;;) { ye++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { ye--; break; } }
    for(;;) { mo++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { mo--; break; } }
    for(;;) { da++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { da--; break; } }
    for(;;) { h++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { h--; break; } }
    for(;;) { m++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { m--; break; } }
    for(;;) { s++; if(((zeitpunkt) - (mktime(h, m, s, da, mo, ye))) < 0) { s--; break; } }
    hour = h; minute = m; second = s; day = da; month = mo; year = ye; return 1;
    }


    Und mich per Timeban Befehl banne, dann kommt folgendes Ergebnis raus (print)

    Code
    User Ap0llinaris time banned - Date: 09.06.2012 - Time: 20:59:27


    Hier mal der /tban Befehl..

    Spoiler anzeigen


    CMD:tban(playerid, params[])
    {
    new pID, grund[64], time, string[128];
    if(sscanf(params, "uis[64]", pID, time, grund))return SendClientMessage(playerid, COLOR_GREY, "* Benutze /tban [SpielerID/Name] [Zeit in Min.] [Grund]");
    if(Spieler[playerid][pAdmin] < 1)return SendClientMessage(playerid, COLOR_GREY, "Du besitzt nicht die benötigten Rechte.");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, COLOR_GREY, "Der Spieler ist nicht online.");
    if(time < 1 || time > 14400)return SendClientMessage(playerid, COLOR_GREY, "Die Zeit sollte sich zwischen 1 und 14400 liegen. (1 Minute oder 10 Tage)");
    new tBanTime = time * 60;
    tBanTime = tBanTime + gettime();
    Spieler[pID][pTimeBan] = tBanTime;
    new tDay, tMonth, tYear, tHour, tMinute, tSecond;
    ConvertUnix(tBanTime, tHour, tMinute, tSecond, tDay, tMonth, tYear);
    printf("User %s time banned - Date: %02d.%02d.%d - Time: %02d:%02d:%02d", GetName(pID), tDay, tMonth,tYear, tHour, tMinute, tSecond);
    format(string, sizeof(string), "%s wurde von %s für %d Minuten gebannt, Grund: %s", GetName(pID), GetName(playerid), time, grund);
    SendClientMessageToAll(COLOR_DARKRED, string);
    Kick(pID);
    return 1;
    }

    Funktionieren tut alles, nur die Zeit wird nicht richtig angezeigt. :/


    Kann jemand helfen?


    //Edit
    Ist wirklich dringend, die User wollen Bugfrei spielen. :/
    Hab mich auch schon überall erkundigt, und alle Themen durchgeschaut. Da hatte ich glaube Nortex die Funktion, die ich hier auch habe. (ConvertUnix) nur geht es nicht. :/


    //Edit-2
    Hab schon überall nachgefragt bei Leuten wie VIPER Usw, die können aber auch net helfen. :/


    //Edit-3
    Überschrift ...

  • Stimmt, jetzt habe ich es verstanden wie du das meinst. Im engl. SA:MP Forum hat jemand eine Include released, mit der man das machen kann. Wenn das Forum nicht offline wäre, würde ich dir ja einen Link schicken. Guck dort einfach in wenigen Stunden nochmal. Oder google mal nach Timestampumrechnung c / c++. Scheint ja ähnlich zu funktionieren.


    Regards, ThomasTailor93

  • Schonmal über den MySQL Weg versucht ?


    stock datum(timestamp)
    {
    new Get[128];
    format(query, 128," SELECT FROM_UNIXTIME(%d, '%s.%s.%s %s')",timestamp,"%e","%M","%Y","%T");
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    return Get;
    }


    //Test CMD


    ocmd:test123(playerid,params[])
    {
    new string[256];
    format(string,256,"Datum: %s",datum(DeinTimecode));
    SendClientMessage(playerid,0xFFFFFF,string);
    return 1;
    }


    Wird dann so aussehen:
    (Die Punkte kannst du im Stock j selbst entfernen wenn du möchtest)


    MfG.
    Me

  • Wenn ich jetzt nichts falsch gelöscht habe versuchs mal so:


    stock datum(timestamp)
    {
    new Get[128];
    format(query, 128," SELECT FROM_UNIXTIME(%d, '%s. %s %s %s')",timestamp,"%e","%M","%Y","%T");
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    return Get;
    }


    CMD:tban(playerid, params[])
    {
    new pID, grund[64], time, string[128];
    if(sscanf(params, "uis[64]", pID, time, grund))return SendClientMessage(playerid, COLOR_GREY, "* Benutze /tban [SpielerID/Name] [Zeit in Min.] [Grund]");
    if(Spieler[playerid][pAdmin] < 1)return SendClientMessage(playerid, COLOR_GREY, "Du besitzt nicht die benötigten Rechte.");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid, COLOR_GREY, "Der Spieler ist nicht online.");
    if(time < 1 || time > 14400)return SendClientMessage(playerid, COLOR_GREY, "Die Zeit sollte sich zwischen 1 und 14400 liegen. (1 Minute oder 10 Tage)");
    new tBanTime = time * 60;
    tBanTime = tBanTime + gettime();
    Spieler[pID][pTimeBan] = tBanTime;
    printf("User %s time banned - Date: %s", GetName(pID), datum(tBanTime));
    format(string, sizeof(string), "%s wurde von %s für %d Minuten gebannt, Grund: %s", GetName(pID), GetName(playerid), time, grund);
    SendClientMessageToAll(COLOR_DARKRED, string);
    Kick(pID);
    return 1;
    }

  • Klappt gut, hab mich für 22 Minuten gebannt und in der Console steht 13. July 2012 11:35:..


    Nun möchte ich das aber auf Deutsch haben, und wenn man sich einloggt und tbanned ist soll da stehen: Du bist noch bis zum 14. Juli 2012 um 11:45:33 gebannt.


    Kannst du da helfen?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Dann bräuchte ich wohl doch eine bessere ConvertUnix Funktion wie oben. Ich denke schon dass es möglich ist, nur bleibt die Frage: Wie? :/


    //e
    Da mir IntelligenT nicht richtig helfen konnte, aber zum Glück >etwas<, wollte ich fragen ob jemand weiß wie man denn das Format davon ändern kann?

  • Nein, ist nicht möglich. mySQL ist nicht in der Lage ihre Ausgaben zu übersetzen. Das müsstest du nachträglich mit PAWN verwirklichen und eine Replace-Funktion schreiben. Glaube sowas hat PAWN nicht von selbst.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Entweder ne eigene String Replace Funktion schreiben, oder via strtok und if-abfrage die Wörter übersetzen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'