Datum vergleichen?

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 leute,
    ich möchte für ein Timeban-System das Datum von dem Ban, mit dem Aktuellen überprüfen.
    Genau wie mit der Zeit.


    Ich hab das in nen string ausgelesen, muss ich aber evtl. anders machen.
    Jemand eine Lösung?
    Gerade überhaupt Kp wie ich das machen soll.




    MfG Firer

  • Also erstmal brauchst du dafür 2 Funktionen. mktime um den timestamp eines bestimmten datums auszugeben, und Now um dir den timestamp von jetzt gerade ausgeben zu lassen. Dieser beinhaltet die Anzahl der Sekunden seit dem 1.1.1970 um 00:00 Uhr (falls das nicht so ist, berichtigt mich bitte^^).
    Also erstmal mktime:
    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2;
    timestamp2 = second + (minute * 60) + (hour * 3600);
    new days_of_month[12];
    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
    new i=0;
    for(; i<month-1;i++) {
    days_this_year += days_of_month[i];
    }
    }
    timestamp2 += days_this_year * 86400;
    new j=1970;
    for(;j<year;j++) {
    timestamp2 += 31536000;
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp2 += 86400; // Schaltjahr + 1 Tag
    }
    return timestamp2;
    }
    Die funktion gibt den timestamp vom angegebenen Zeitpunkt (hour,minute,second,day,month,year) zurück.
    Und Now():
    stock Now()
    {
    new hour,minute,second,year,month,day;
    gettime(hour, minute, second);
    getdate(year, month, day);
    return mktime(hour,minute,second,day,month,year);
    }
    Gibt einfach den timestamp von dem zeitpunkt aus an dem du die funktion ausführst.


    Jetzt kannste einmal wenn du jemanden für eine bestimmte Zeit banst dir den timestamp ausgeben lassen und die zeit wie lange er gebannt sein soll dazu rechnen (in sekunden). Das speicherst du dann ab, und überprüfst dann einfach den Aktuellen timestamp mit dem den du bei dem ban gespeichert hast. Ist der aktuelle timestamp kleiner als der, den du gespeichert hast ist der Ban noch nicht abgelaufen. ist er größer bzw gleich ist der ban ausgelaufen und du kannst den spieler wieder entbannen bzw auf den server lassen.


    Also beim ban:
    StempelDerGespeichertWird=Now()+120;//120 währen 2 Minuten
    Den speicherste dann in einer datei oder per MYSQL und wie auch immer du das vor hast.
    Und dann wenn er connectet fragste einfach ab:
    if(Now()<StempelDerGespeichertWurde)//DIe Zeit ist noch nicht abgelaufen
    {
    new string[64],
    duration=(StempelDerGespeichertWurde-Now())/60;//errechnet die zeit wie lange der Spieler noch gebannt ist in Minuten
    SendClientMessage(playerid, FARBE_GELB, "Dieser Account ist noch gebannt blablabla");
    format(string, sizeof(string), "Dauer: Noch %d Minuten", duration+1);//falls du anzeigen willst wie lange er/sie noch gebannt ist. Die +1 am ende ist einfach damit falls man nur noch eine minute gebannt ist da nicht 0 steht.
    SendClientMessage(playerid, FARBE_GELB, string);
    Kick(playerid);
    }
    else
    {
    //ban aus datei oder mysql tabelle entfernen
    }

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Sorry wenn ich den alten Thread jetzt wieder rauskrame, aber das Funktioniert alles nicht X(
    Die Datei wird zwar erstellt und alles, aber beim connecten wird die Ban-Datei immer entfernt, auch wenn der Ban noch nicht ausgelaufen ist.
    OnPlayerConnect
    if(INI_Exists(string))
    {
    bantime = INI_ReadInt("dauer");
    INI_ReadString(admindgh,"admin",MAX_PLAYER_NAME);
    if(Now()<bantime)
    {
    new duration=(bantime-Now())/60;
    SendClientMessage(playerid,COLOR_RED,"** Dieser Account ist gebannt **");
    SendFormatMessage(playerid,COLOR_RED,"** Admin: %s | Dauer: %d Minuten **",admindgh,duration+1);
    Kick(playerid);
    }
    else
    {
    INI_Remove(string);
    }
    }
    Stock für den Ban:
    stock tBan(playerid,zeit,admin[])
    {
    new ipstring[40];
    format(ipstring,sizeof(ipstring),"bans/%s.txt",pname[playerid]);
    if(INI_Open(ipstring))
    {
    INI_WriteInt("dauer",(Now()+(zeit*60)));
    INI_WriteString("admin",admin);
    INI_Save();
    INI_Close();
    }
    Kick(playerid);
    }


    //EDIT: Genauere Infos eingefügt