Jump to content
Prosíme všetkých užívateľov, ktorý sa chcú opätovne pripojiť na discord aby znovu spárovali svoje účty kliknutím na "Discord" v navigácií a pripojili sa na server Read more... ×
  • 0
Anonimus24

pomoc Gettime

Dotaz

Ahoj prosím o radu jak nastavit toto aby mi to ukazovalo správný počet dnů? aby mi to neukazovalo o jeden den miň děkuji

new KonecVIP = 1_600_000_000;//timestamp, neco jsem zvolil

format(string,sizeof(string),"Za %d dni ti konci VIP",(KonecVIP-gettime())/(24*60*60));//24*60*60 = pocet vterin za 1 den (pozor, zaokrouhluje vzdy dolu tj 0.999 = 0!)

Sdílet tento příspěvek


Link to post
Share on other sites

26 odpovědí na tuto otázku

Recommended Posts

  • 1
On 4. 5. 2019 at 0:08, Anonimus24 said:

A můžu se zeptat ještě jak můžu nastavit aby to bylo přímo ten čad od 00:00 než od toho času co se mi tam dá tím gettime

Úplne nerozumiem, čo chceš urobiť. 

Miesto KonecVIP - gettime() chceš urobiť KonecVIP - timestamp poslednej polnoci?

Môžeš skúsiť niečo takéto (netestoval som):

Spoiler

#define SECONDS_PER_DAY (60 * 60 * 24)

GetLastMidnightTimestamp()
{
    return (gettime() / SECONDS_PER_DAY) * SECONDS_PER_DAY;
}

GetPlayerVIPDaysLeft(playerid)
{
    new endTimestamp = KonecVIP[playerid];
    new midnightTimestamp = GetLastMidnightTimestamp();
    if (endTimestamp < midnightTimestamp)
        return 0;
  
    return (endTimestamp - midnightTimestamp) / SECONDS_PER_DAY;
}

 

Keď to chceš ale robiť takto, mysli na to, že VIP skončí hráčom vždy presne o polnoci bez ohľadu na to, kedy si ho kúpia. 

Ak si teda kúpim VIP na 1 deň 5.5. 00:01, do KonecVIP mi nastavíš timestamp 6.5. 00:01, ale budem ho môcť používať až do 6.5. 23:59:59 (teda skoro celý deň navyše).

Ak si ho ale kúpim na 1 deň 5.5. 23:59, bude mi tiež platiť iba do 6.5. 23:59:59.

// EDIT: 

Kód som písal čerstvo prebudený, nedoplo mi, že keď odčítavam midnightTimestamp miesto gettime(), tak dostanem vo výsledku o deň viac a tak tam + 1 nemá čo hľadať.

Edited by DuFF
  • Děkuji (+1) 1

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Just now, Wrong Time Wrong Place said:

Přičti 1 a máš hned o den víc.

format(string,sizeof(string),"Za %d dni ti konci VIP",(KonecVIP-gettime())/(24*60*60) + 1);

e. pardon místo editu jsem dal další příspěvek a navíc ti to už napsal DuFF.

Edited by Wrong Time Wrong Place

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
Spoiler

format(STR, sizeof(STR), "%sVip ti skončí za (%d dnů -> %s)\n", STR,GetPlayerVIPDaysLeft(KonecVIP[playerid]),BanDate(KonecVIP[playerid], 6));

stock BanDate( timestamp, _form=0 )
{
	new year=1970, day=0, month=0, hour=0, mins=0, sec=0;

	new days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	new names_of_month[12][10] = {"Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"};
	new returnstring[100];

	while(timestamp>31622400){
	timestamp -= 31536000;
	if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp -= 86400;
	year++;
	}

	if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) )
	days_of_month[1] = 29;
	else
	days_of_month[1] = 28;


	while(timestamp>86400){
	timestamp -= 86400, day++;
	if(day==days_of_month[month]) day=0, month++;
	}

	while(timestamp>60){
	timestamp -= 60, mins++;
	if( mins == 60) mins=0, hour++;
	}
	if(hour >= 24)
	{
	    hour = 0;
	    day ++;
	}

	sec=timestamp;
	if((hour + 1) >= 24) hour = -1;//je to dobře
	switch( _form ){
	case 1: format(returnstring, 100, "%02d/%02d/%d %02d:%02d:%02d", day+1, month+1, year, hour + 1, mins, sec);
	case 2: format(returnstring, 100, "%s %02d, %d, %02d:%02d:%02d", names_of_month[month],day+1,year, hour, mins, sec);
	case 3: format(returnstring, 100, "%d %c%c%c %d, %02d:%02d", day+1,names_of_month[month][0],names_of_month[month][1],names_of_month[month][2], year,hour,mins);
	case 4: format(returnstring, 100, "(%02d/%02d/%d | %02d:%02d:%02d)", day+1, month+1, year, hour + 1, mins, sec);

	default: format(returnstring, 100, "%02d.%02d.%d %02d:%02d:%02d", day+1, month+1, year, hour, mins, sec);
	}

	return returnstring;
}

A stále mi to neukazuje přímo ten čas v kolik to má končit jak to můžu udělat aby to ukazovalo?

Jinak super hodně pomohlo :) 


 

Edited by Anonimus24

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

A ještě jsem se chtěl zeptat pokud teda do toho gettime pridám tu 1 tak mi to ukazuje ješte o jeden den víc... myslíte že by to mohlo být tímto

#define Days(%0) (86400 * %0)

 

jelikož mám 

Sav[VIP][playerid] += Days(1);

 

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
format(STR, sizeof(STR), "%sVIP končí za (%d dnů -> %s)\n", STR,GetPlayerVIPDaysLeft(playerid),BanDate(Sav[VIP][playerid], 6));
#define SECONDS_PER_DAY (60 * 60 * 24)

GetLastMidnightTimestamp()
{
    return (gettime() / SECONDS_PER_DAY) * SECONDS_PER_DAY;
}

GetPlayerVIPDaysLeft(ObchodID)
{
    new endTimestamp = Sav[VIP][playerid];
    new midnightTimestamp = GetLastMidnightTimestamp();
    if (endTimestamp < midnightTimestamp)
    return 0;

    return (endTimestamp - midnightTimestamp) / SECONDS_PER_DAY + 1;
}

takhle to přesně celé mám.... a ukazuje mi to o jeden víc... jelikož jsem potřeboval aby to vždy končilo o 00:00

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

takhle to mám pokud to VIP ještě nemá koupené:

#define Days(%0) (86400 * %0)

 

Spoiler

Sav[VIP][playerid] += gettime() + Days(2);

 

a pak mám když hráč už VIP má tak je to bez toho gettime() a to je vše jinak kódy co vydíte jsou stejne

Spoiler

#define SECONDS_PER_DAY (60 * 60 * 24)

GetLastMidnightTimestamp()
{
    return (gettime() / SECONDS_PER_DAY) * SECONDS_PER_DAY;
}

GetPlayerVIPDaysLeft(ObchodID)
{
    new endTimestamp = Sav[VIP][playerid];
    new midnightTimestamp = GetLastMidnightTimestamp();
    if (endTimestamp < midnightTimestamp)
    return 0;

    return (endTimestamp - midnightTimestamp) / SECONDS_PER_DAY + 1;
}

 

 

format(STR, sizeof(STR), "%sVIP končí za (%d dnů -> %s)\n", STR,GetPlayerVIPDaysLeft(playerid),BanDate(Sav[VIP][playerid], 6));

A to je všechno

 

Edited by Anonimus24

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
před 10 hodinami, Anonimus24 said:

return (endTimestamp - midnightTimestamp) / SECONDS_PER_DAY + 1;

Naposledy ti Atomas radil z tohto riadku zmazať "+ 1" a súhlasím s ním. Doporučujem ti vyskúšať to, pretože ak ti to teraz vždy ukazuje o deň viac, PO ZMAZANÍ "+ 1" ti bude zaručene ukazovať správny počet.

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
před 43 minutami, DuFF said:

Naposledy ti Atomas radil z tohto riadku zmazať "+ 1" a súhlasím s ním. Doporučujem ti vyskúšať to, pretože ak ti to teraz vždy ukazuje o deň viac, PO ZMAZANÍ "+ 1" ti bude zaručene ukazovať správny počet.

Ano to mi funguje ale ted mi jde zase o to že ted se mi když to mám v dialogu ukáže těch počet dní ten je správný ale ten datum dd.mm.rrrr. 00:00:00 tak to se mi ukazuje úplně špatně datum který ještě nebyl nevíte někdo proč?

 

,BanDate(GetPlayerVIPDaysLeft(VIP), 6)

mám tam tohle a když tam dám toto

,BanDate(Sav[VIP][playerid], 6)

tak mi to funguje ale ukazuje čas který se uložil z 

Sav[VIP][playerid] += gettime() + Days(2);

 

 

Edited by Anonimus24

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
před 1 hodinou, Anonimus24 said:

ale ten datum dd.mm.rrrr. 00:00:00 tak to se mi ukazuje úplně špatně

Ideálne by bolo naozaj uložiť si do Sav[VIP][playerid] rovno polnoc, kedy hráčovi skončí VIP, ako píše Lukasz.
Potom by si mohol použiť priamo BanDate(Sav[VIP][playerid], 6).

Skúsil som ti napísať ukážkový kód, ako na to, ale znova som ho netestoval ani nekompiloval, tak ho ber s rezervou.
Verím, že možné chyby s posunutím o 1 deň už dokážeš opraviť.

Spoiler

// Makrá:
#define SECONDS_PER_DAY (60 * 60 * 24)
#define DAYS(%0) (SECONDS_PER_DAY * (%0))

// Predĺženie VIP hráčovi playerid o days dní:
// Pre predĺženie VIP hráča playerid napr. o 2 dni použiješ: ExtendPlayerVIP(playerid, 2)
ExtendPlayerVIP(playerid, days)
{ 
    new endTimestamp = Max(Sav[VIP][playerid], gettime()) + DAYS(days); // Treba myslieť aj na prípad, keď už hráč vlastnil VIP
    Sav[VIP][playerid] = GetNextMidnightFromTimestamp(endTimestamp); // Do Sav[VIP][playerid] sa uloží timestamp ďalšej polnoci po endTimestamp
}

// Tvoj výpis do dialogu:
format(STR, sizeof(STR), "%sVIP končí za (%d dnů -> %s)\n", STR, GetPlayerVIPDaysLeft(playerid), BanDate(Sav[VIP][playerid], 6));

// Zistenie, či má hráč playerid stále platné VIP:
// Môžeš použiť napríklad v podmienke: if (IsPlayerVIP(playerid)) { ... } 
IsPlayerVIP(playerid)
{
    return Sav[VIP][playerid] > gettime();
}

// Pomocné funkcie:
Max(a, b)
{
    return a > b ? a : b;
}

GetNextMidnightFromTimestamp(timestamp)
{
    return GetLastMidnightTimestamp(timestamp + DAYS(1));
}

GetLastMidnightFromTimestamp(timestamp)
{
    return (timestamp / DAYS(1)) * DAYS(1);
}

GetPlayerVIPDaysLeft(playerid)
{
    if (Sav[VIP][playerid] < gettime())
        return 0;

    return (Sav[VIP][playerid] - gettime()) / DAYS(1); 
}

 

 

Edited by DuFF

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

Někdo kdo ještě porádí stímto?
 

Spoiler

stock PlayerSuspectAll(const PlayerIDs[], AdminIDs, SupectIDs, const Duvod[])
{
    new Data[155], STR[100], str[200], STT[MAX_PLAYER_NAME];
    format(STR, sizeof(STR), "Server/Hraci/Suspect/%s.txt", PlayerIDs);
	if(fexist(STR))
	{
		format(STT, sizeof(STT), "%s", PlayerIDs);
        new ID2 = GetPlayerID(STT);

	    new STR_Part[80];
	    format(STR_Part, sizeof(STR_Part), "Server/Hraci/Suspect/%s.part", PlayerIDs);
	    fcreate(STR_Part);
	    //----
	    new File:a = fopen(STR,io_readwrite);
	    new File:b = fopen(STR_Part,io_write);
	    //----
	    while(fread(a,str))
		{
			fwrite(b,str);
		}
		fclose(a);
		fclose(b);
	    //----
	    new File:PFile = fopen(STR,io_write);

	    format(Data,sizeof(Data),"%d %d %s %s %s\r\n", SupectIDs, gettime(), PlayerIP(ID2), PlayerName(AdminIDs), Duvod);

	    fwrite(PFile,Data);
		fclose(PFile);
		//----
	    new File:c = fopen(STR,io_append);
	    new File:d = fopen(STR_Part,io_readwrite);

	    while(fread(d,str))
		{
		    fwrite(c,str);
		}
		fclose(c);
		fclose(d);
		fremove(STR_Part);
	    //----
	}else{
	    fcreate(STR);
	    PlayerSuspectAll(PlayerIDs, AdminIDs, SupectIDs, Duvod);
	}
	return 1;
}

 

 

Spoiler

stock SuspectRead(playerid, const Nick[], Tisk, SuspectVypis, ZjistiPocet, Radek = 1)
{
    if(ZjistiPocet == 0) format(MAX_STR,sizeof(MAX_STR),"");
	new Data[80], ID, STR[200], sTR_IP[50], Vypsanych, VypsPocet;
    format(Data, sizeof(Data), "Server/Hraci/Suspect/%s.txt", Nick);
    if(fexist(Data))
	{
  		new File:soubor = fopen(Data,io_readwrite);
		while(fread(soubor,STR,sizeof(STR)))
		{
		    if(ID >= Radek - 1)
		    {
		        new SupectIDs, Log_Time, IPss[24], AdminName[MAX_PLAYER_NAME], Log_Text[200];
          		sscanf(STR,"iisss", SupectIDs, Log_Time, IPss, AdminName, Log_Text);
		        if(Vypsanych < 50)
		        {
		            if(SuspectVypis == SupectIDs && ZjistiPocet == 0)
		            {
		        		if(Tisk == 0)
			        	{
							format(MAX_STR,sizeof(MAX_STR),"%s%d) %s - %s - %s - Admin: %s - Důvod: %s", MAX_STR, ID + 1, SuspectIDr(SupectIDs), IPss, BanDate(Log_Time, 4), AdminName, Log_Text);
						}else{
						    format(MAX_STR,sizeof(MAX_STR),"%d) %s - %s - %s - Admin: %s - Důvod: %s", ID + 1, SuspectIDr(SupectIDs), IPss, BanDate(Log_Time, 4), AdminName, Log_Text);
						    SCMF(128,playerid,0xFFFFFFAA,"%s", MAX_STR);
						}
						Vypsanych ++;
					}
				}
				if(SuspectVypis == SupectIDs) VypsPocet ++;
			}
            ID ++;
		}
		fclose(soubor);

		if(ZjistiPocet == 1) return VypsPocet;
		if(Tisk == 0)
  		{
	  		//------------------------------------------------------------------
	  		format(sTR_IP, sizeof(sTR_IP), "%s (%s)", Nick, ZjistIP(Nick));
	  		AdminLogRadek[playerid] = Radek;
	  		//------------------------------------------------------------------
			if(Vypsanych > 0)		ShowPlayerDialogEx(playerid, DIALOG_SUSPECT_HRAC, DIALOG_STYLE_MSGBOX, sTR_IP, MAX_STR ,"Řádek", "Tisk");
			else                    SCM(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Tento hráč nemá žádný záznam!");
		}
	}else SCM(playerid,COLOR_GREEN_LIGHT,"Tento hráč nemá žádný záznam!");
	return 1;
}

 

 

Spoiler

image.thumb.png.aef6bcc4c45706fcdd94373262dec63f.png

 

Chyba je ta že mi to ukazuje špatný čas a nevím jak nastavit tak aby mi to ukazovalo správný čam mi jde o hodinu zpět.

 

Edited by Anonimus24

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0

gettime vraci utc (tedy neuvazuje casove pasmo - coz je moudre kdyz si ho 2x rocne menime). Na to je potreba brat ohled. Pokud ti jde jen ciste o vypsani datumu udeleni trestu a nic jineho, potom je pro tebe nejjednoduzsi reseni pouzit misto

format(Data,sizeof(Data),"%d %d %s %s %s\r\n", SupectIDs, gettime(), PlayerIP(ID2), PlayerName(AdminIDs), Duvod)

neco jako

new yy,mm,dd,h,m,s;
gettime(h,m,s);//zkontroluj posloupnost parametru ted nwm z hlavy jak jdou za sebou :)
getdate(yy,mm,dd);//tady taky
format(Data,sizeof(Data),"%d %02d.%02d.%d %02d:%02d:%02d %s %s %s\r\n", SupectIDs, dd,mm,yy,h,m,s, PlayerIP(ID2), PlayerName(AdminIDs), Duvod);

Protoze parametr ty funkce uz casove pasmo uvazuji.

Dalsi vec je jestli mas nastaveny spravny cas na serveru (date in terminal).

Edited by ATomas

Sdílet tento příspěvek


Link to post
Share on other sites
  • 0
On 8. 5. 2019 at 11:36, DuFF said:

Ideálne by bolo naozaj uložiť si do Sav[VIP][playerid] rovno polnoc, kedy hráčovi skončí VIP, ako píše Lukasz.
Potom by si mohol použiť priamo BanDate(Sav[VIP][playerid], 6).

Skúsil som ti napísať ukážkový kód, ako na to, ale znova som ho netestoval ani nekompiloval, tak ho ber s rezervou.
Verím, že možné chyby s posunutím o 1 deň už dokážeš opraviť.

  Opětovně skrýt obsah


// Makrá:
#define SECONDS_PER_DAY (60 * 60 * 24)
#define DAYS(%0) (SECONDS_PER_DAY * (%0))

// Predĺženie VIP hráčovi playerid o days dní:
// Pre predĺženie VIP hráča playerid napr. o 2 dni použiješ: ExtendPlayerVIP(playerid, 2)
ExtendPlayerVIP(playerid, days)
{ 
    new endTimestamp = Max(Sav[VIP][playerid], gettime()) + DAYS(days); // Treba myslieť aj na prípad, keď už hráč vlastnil VIP
    Sav[VIP][playerid] = GetNextMidnightFromTimestamp(endTimestamp); // Do Sav[VIP][playerid] sa uloží timestamp ďalšej polnoci po endTimestamp
}

// Tvoj výpis do dialogu:
format(STR, sizeof(STR), "%sVIP končí za (%d dnů -> %s)\n", STR, GetPlayerVIPDaysLeft(playerid), BanDate(Sav[VIP][playerid], 6));

// Zistenie, či má hráč playerid stále platné VIP:
// Môžeš použiť napríklad v podmienke: if (IsPlayerVIP(playerid)) { ... } 
IsPlayerVIP(playerid)
{
    return Sav[VIP][playerid] > gettime();
}

// Pomocné funkcie:
Max(a, b)
{
    return a > b ? a : b;
}

GetNextMidnightFromTimestamp(timestamp)
{
    return GetLastMidnightTimestamp(timestamp + DAYS(1));
}

GetLastMidnightFromTimestamp(timestamp)
{
    return (timestamp / DAYS(1)) * DAYS(1);
}

GetPlayerVIPDaysLeft(playerid)
{
    if (Sav[VIP][playerid] < gettime())
        return 0;

    return (Sav[VIP][playerid] - gettime()) / DAYS(1); 
}

 

 

Ahoj tak mám problém a to je problém jen že datum ukazuje dobře ale čas mi to ukazuje v -hh.mm.ss.

Tak že nevím teď jak to udělat opravdu jsem vyzkoušel jsem co bylo v mých schopnostech a stále mi to negunguje...

Sdílet tento příspěvek


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×