Sveiki, šiame support'e esu jau kurį laiką ir manau jau pats metas parašyti kokią nors retesnę pamoką
. Pirmoji mano pamoka yra apie laiko žymes/skales, kitaip dar vadinamas UNIX TIMESTAMPS. Tačiau viskas iš pradžių.1. Kas yra UNIX TIMESTAMP?
UNIX TIMESTAMP yra laiko trukmė nuo 1970 m. sausio 1 d. iki 2038 m. sausio 19 d. UNIX TIMESTAMP yra sveikasis skaičius (angl. integer), kuris nurodo kiek praėjo sekundžių nuo 1970 m. sausio 1d. Daugelis SA:MP skripterių, ypač lietuvių, naudoja kur kas sunkesnius būdus talpinant datą (pvz.: išsaugoja metus, mėnesius, dienas, valandas, minutes ir sekundes atskirai), todėl jų skriptai tampa, kur kas labiau apkrauti, nei būtų naudojant vieną UNIX TIMESTAMP. UNIX TIMESTAMP atrodo taip: 1320404821.
2. Kada naudoti UNIX TIMESTAMP?
Mano nuomone, UNIX TIMESTAMP geriausiai naudoti visose situacijose, kur naudojate datas. Pavyzdžiui, norite sukurti VIP'ą, kuris galiotų parą/savaitę/mėnesį. Situacijų, kuriose ši naudinga funkcija gali būti panaudota yra begalė, tereikia šiek tiek išradingumo. Aš asmeniškai UNIX TIMESTAMP naudoju ir registracijos bei prisijungimo datoms, kurias atvaizduoju tinklalapyje, nes šis būdas daug paprastesnis.
3. Kaip išgauti UNIX TIMESTAMP PAWN skripte?
Turbūt kiekvienas žinote funkciją, kurią naudojate išgaunant valandas, minutes ir sekundes:
Kodas: Pasirinkti visus
gettime( &hour, &minute, &second );Kodas: Pasirinkti visus
new
timestamp = gettime( );4. Kaip prie UNIX TIMESTAMP pridėti, kurį nors laiko tarpą?
Kaip ir anksčiau minėjau UNIX TIMESTAMP yra sveikasis skaičius (angl. integer) ir jame nurodomas laiko tarpas sekundėmis, todėl mes su juo galime atlikti įvairius skaičiavimus. Todėl kiekvieną laiko tarpą turime pasiversti sekundėmis:
- 1 minutė: 60 * 1 = 60 sek.
- 15 minučių: 60 * 15 = 900 sek.
- 1 valanda: 60 * 60 = 3600 sek.
- 24 valandos (para): 60 * 60 * 24 = 86400 sek.
- 1 savaitė: 60 * 60 * 24 * 7 = 604800 sek.
- 1 mėnuo: 60 * 60 * 24 * 30 = 2592000 sek.
- 1 metai: 60 * 60 * 24 * 365 = 31536000 sek.
Pavyzdžiui, žaidėjas nusiperka VIP'ą kuris galioja 1 mėnesį:
Kodas: Pasirinkti visus
new
galioja = gettime( ) + 2592000; // Prie šiandien dienos pridedame 1 mėnesį5. Kaip iššifruoti UNIX TIMESTAMP?
Šis punktas yra juodoji šios funkcijos pusė. PAWN kalboje iššifravimo funkcijos nėra. Tačiau tai nesumažina UNIX TIMESTAMP patogumo, nes atvejų, kai reikia iššifruoti UNIX TIMESTAMP pačiame serveryje yra labai mažai, nebent norite žaidėjo statistikoje rodyti datą, kiek jam galioja VIP ir panašiai. Bet jei jūsų serveris turi tinklalapį, tuomet ten nesunkiai galite iššifruoti UNIX TIMESTAMP, nes PHP programavimo kalboje yra date( ) funkcija.
Pavyzdys:
Kodas: Pasirinkti visus
<?php
date( "Y-m-d G:i:s", $timestamp ); // Atvaizduos 2011-04-17 21:15:41 tipo datą
?>6. Kaip naudoti UNIX TIMESTAMP su MySQL?
Visas naudojimas išlieka tas pats, tačiau jei norite į duomenų bazę įrašyti datą UNIX TIMESTAMP tipo, jums nebereikia naudoti gettime( ) funkcijos, nes MySQL turi UNIX_TIMESTAMP( ) parametrą.
Pavyzdys:
Kodas: Pasirinkti visus
new
sql[ 128 ];
format ( sql, sizeof ( sql ), "INSERT INTO `bans` (`name`, `id`, `date`, `expire`) VALUES ('%s', %d, UNIX_TIMESTAMP( ), UNIX_TIMESTAMP( ) + 604800 )", name, id );
mysql_query( sql );Ši užklausa:
- Į `date` laukelį įrašys datą, kada žaidėjas buvo užblokuotas.
- Į `expire` laukelį įrašys datą, kada žaidėjas bus atblokuotas (po 1 savaitės).
7. Kaip lyginti vieną UNIX TIMESTAMP su kitu?
UNIX TIMESTAMP yra sveikieji skaičiai, todėl tikrindami galime naudoti >, <, >=, <= veiksmus.
Pavyzdys, kuriame tikriname blokavimo galiojimo laiką:
Kodas: Pasirinkti visus
new
sql[ 128 ];
format ( sql, sizeof ( sql ), "SELECT `expire` FROM `bans` WHERE `id` = %d", id );
mysql_query( sql );
mysql_store_result( );
new
expire = mysql_fetch_int( );
mysql_free_result( );
if ( gettime( ) > expire )
{
// Jei jau praėjo nurodytas laikas - atblokuojame
}Pabaigai
Pamoką, kuriau išsamią, todėl nesiskūskit, kad per ilga, o jei kas neaišku - klauskit. Laukiu pastabų, nuomonių, komentarų. Laukit kitų mano pamokų.







