We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.
Het resultaat trunc je, dus alles voor de komma noemen we ff resultaat, alles achter de komma heet 'rest'. Tel resultaat bij jaren op. Vermenigvuldig rest met aantal minuten per jaar. Dit is je nieuwe getal.
Deel het nieuwe getal door het aantal minuten per maand. Tel resultaat bij maanden op, vermenigvuldig de rest met het aantal minuten per maand.
Deel dit nieuwe getal door het aantal minuten per dag.
Tel resultaat bij dagen op, vermenigvuldig de rest met het aantal minuten per dag.
Deel dit nieuwe getal door het aantal minuten per uur.
Tel resultaat bij uren op, vermenigvuldig de rest met het aantal minuten per uur. Tel dit getal bij de minuten op. Klaar.
Deze post is sterk afhankelijk van de toetsen C, V en control. Eventuele onnauwkeurigheden zijn te wijten aan het feit dat de topicstarter hier zo goed als een scriptrequest plaatst
Disclaimer: er zijn rekenkundig betere methoden, maar daarvoor is het me nu te laat, en die vergen bovendien iets meer tikwerk. Trusten allemaal
Journalism is printing what someone else does not want printed; everything else is public relations.
Je moet gewoon rekenen in dag/uren/minuten/seconden vanaf een bepaalde datum (afhankelijk van de nauwkeurigheid).Op woensdag 24 juli 2002 02:34 schreef WarMaster het volgende:
*zucht* wat is en blijft die tijd toch ook <vul een scheldwoord in>.
Enfin.. To the point.
In het programmeertaaltje "small" (gebasseerd op C) ben ik iets in elkaar aan het flansen als zijnde een plugin voor een gameserver.
Situatie is als volgt, men heeft een zogenaamde "ban" die is uitgegeven op een bepaalde tijd (timestamp) voor een bepaalde lengte (Bantime).
Nu heb ik echt een HELSE pest met het ontwerpen van een geschikt algoritme.
De Timestamp wordt gegeven in de vorm: dd-mm-yyyy hh:mm:ss
De BanTime wordt gegeven in hele minuten.
Op zich zit ik totaal niet met het breaken van de strings of iets dergelijks dus let daar maar ff niet op.
De maanden komen totaal niet nauw, gewoon 30 dagen, en een jaar gewoon 365 dagen, zonder schrikkel geneuzel.
Hoe pak je dit in vredensnaam goed aan?
Ik meen dat er een tijdvorm bestond (internettijd?) waarmee je gewoon kon rekenen... Of niet?
Enfin.. Wat zou daar het codeer/decodeer algoritme voor zijn?
Het hoeft niet in perfect small/C/whatever, gewoon een goede uitleg zou al perfect zijn.
Wie heeft hier ervaring mee?
Sterker nog: Wie weet een geschikte oplossing?
Stel dat je rekend vanaf 01-01-2000
maak een timestamp voor die datum: 01012000000000
nu neem je de datum die je wilt omrekenen, bv het moment dat ik dit schrijf, timestamp: 24072002025200
Split bijde timestamps op, dus: 01 01 2000 00 00 00
en: 24 07 2002 02 52 00
Trek nu je referentie stamp van de huidige stamp af:
24 07 2002 02 52 00
01 01 2000 00 00 00
-------------------
23 06 0002 02 52 00
Doe nu het aantal maanden maal 30 en het aantal jaren maar 365 en tel het geheel op:
23 + (6 * 30) + (2 * 365) = 933 dagen
933 * 24 ( + 2) = 22394 uur
22394 * 60 (+ 52) = 1343692 minuten
* 60 (+ 0) = 80621520 seconden
Op die manier kun je heel makkelijk rekenen, je kunt er dagen bij optellen/aftrekken tot op de seconde nauwkeurig.
Nu kun je simpelweg de tot een aantal seconden gereduceerde bantijd vergelijken met de tot seconden gereduceerde huidige tijd. bantijd > now() user is nog gebanned. bantijd < now() user's ban is over.
D'r zit natuurlijk een onnauwkeurigheid, doordat je uitgaat van 30 dagen in een maand.
After all, we are nothing more or less than what we choose to reveal.
Hoe kan je dat dan het beste oplossen?
Ik heb nog eens zitten denken aan die onnauwkeurigheid van 30 dagen en 365 dagen in een jaar, en ik vraag me af of het nou wel of niet kwaad kan. Hoe zou die onnauwkeurigheid zich namelijk manifesteren?
Hetgeen wat ik uit dat algoritme moet krijgen is op zich vrij basaal:
- Vergelijk de timestamp + bantime tegen de currenttime.
- Bantime voorbij?
- Indien nee: Hoeveel tijd (in mins) moet er nog gebanned worden.
We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.
Als het goed is krijg je alleen negatieve waarden als je data van voor je referentie datum gebruikt.Op woensdag 24 juli 2002 13:18 schreef WarMaster het volgende:
Hmmm dat aftrekken van de 2 tijden gaat ook niet echt lekker want je hebt dan soms negatieve waarden.
Hoe kan je dat dan het beste oplossen?
Ik heb nog eens zitten denken aan die onnauwkeurigheid van 30 dagen en 365 dagen in een jaar, en ik vraag me af of het nou wel of niet kwaad kan. Hoe zou die onnauwkeurigheid zich namelijk manifesteren?
Hetgeen wat ik uit dat algoritme moet krijgen is op zich vrij basaal:
- Vergelijk de timestamp + bantime tegen de currenttime.
- Bantime voorbij?
- Indien nee: Hoeveel tijd (in mins) moet er nog gebanned worden.
Voor de rest kun je met negatieve waarden net zo goed rekenen als met positieve, het maakt geen fluit uit.
After all, we are nothing more or less than what we choose to reveal.
Dus een relaxte datum pikken zit er helaas niet bij
Ja OF je moet eerst de 2 beiden tegen een ref datum afwegen... En dan die weer van elkaar aftrekken.
Zucht... INGEWIKKEEEEEEEEELD
We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.
Gewoon het aantal seconden vanaf <basisdatum>, daar tel je je bantime in seconden bij op en dat vergelijk je met de huidige tijd in seconden vanaf <basisdatum>. Dan ben je klaar.
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
right... alleen jammer dat een jaar geen vast aantal minuten heeft heOp woensdag 24 juli 2002 03:14 schreef Rataplan het volgende:
Bantime delen door het aantal minuten per jaar.
Het resultaat trunc je, dus alles voor de komma noemen we ff resultaat, alles achter de komma heet 'rest'. Tel resultaat bij jaren op. Vermenigvuldig rest met aantal minuten per jaar. Dit is je nieuwe getal.
Deel het nieuwe getal door het aantal minuten per maand. Tel resultaat bij maanden op, vermenigvuldig de rest met het aantal minuten per maand.
Deel dit nieuwe getal door het aantal minuten per dag.
Tel resultaat bij dagen op, vermenigvuldig de rest met het aantal minuten per dag.
Deel dit nieuwe getal door het aantal minuten per uur.
Tel resultaat bij uren op, vermenigvuldig de rest met het aantal minuten per uur. Tel dit getal bij de minuten op. Klaar.
scriptrequest? niet bepaald...Deze post is sterk afhankelijk van de toetsen C, V en control. Eventuele onnauwkeurigheden zijn te wijten aan het feit dat de topicstarter hier zo goed als een scriptrequest plaatst
zeg dan nietsDisclaimer: er zijn rekenkundig betere methoden, maar daarvoor is het me nu te laat, en die vergen bovendien iets meer tikwerk. Trusten allemaal
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Hmmm ja ik ken dat punt 1 niet, maar ik zit natuulijk ook vast aan een bepaalde programmeer omgeving.Op woensdag 24 juli 2002 16:04 schreef Gerco het volgende:
Wat is er mis met de unix epoch? (of iedere andere vaste-basis timestamp)
Gewoon het aantal seconden vanaf <basisdatum>, daar tel je je bantime in seconden bij op en dat vergelijk je met de huidige tijd in seconden vanaf <basisdatum>. Dan ben je klaar.
Zou je wat meer over kunnen vertellen, of tenminste waar ik er meer over kan vinden?
We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.
Dat is precies wat ik je hierboven vertelde. Je neemt 01-01-2000 00:00:00 als referentie datum en rekent als je timestamps om naar seconden vanaf deze datum.Op woensdag 24 juli 2002 16:24 schreef WarMaster het volgende:
[..]
Hmmm ja ik ken dat punt 1 niet, maar ik zit natuulijk ook vast aan een bepaalde programmeer omgeving.
Zou je wat meer over kunnen vertellen, of tenminste waar ik er meer over kan vinden?
After all, we are nothing more or less than what we choose to reveal.
Verwijderd
1
2
3
4
| dTimeStamp=new Date(); //huidige datum nBanTime=10; //in minuten //nu datum/tijd uitrekenen wanneer de gebruiker er weer in mag dTimeStamp.setMinutes( dTimeStamp.getMinutes()+nBanTime ); |
Het voordeel om standaard datum/tijd functies te gebruiken lijken me duidelijk: middernacht/schikkeljaren/schikkelseconden (ze bestaan), alles wordt opgelost.
VB heeft de DateAdd functie, en C heeft vast ook wel iets (it's been too long).
<edit>Het date-object zorgt dus dat de overflow automatisch goed gaat.</edit>
Hmmm ja, alleen krijg ik alles in een string uitgepoept.Op woensdag 24 juli 2002 23:26 schreef Doekman het volgende:
In javascript laat ik het date-object het werk doenVoorbeeldcode lijkt me het mee het meest zeggend:
code:
1 2 3 4 dTimeStamp=new Date(); //huidige datum nBanTime=10; //in minuten //nu datum/tijd uitrekenen wanneer de gebruiker er weer in mag dTimeStamp.setMinutes( dTimeStamp.getMinutes()+nBanTime );
Het voordeel om standaard datum/tijd functies te gebruiken lijken me duidelijk: middernacht/schikkeljaren/schikkelseconden (ze bestaan), alles wordt opgelost.
VB heeft de DateAdd functie, en C heeft vast ook wel iets (it's been too long).
<edit>Het date-object zorgt dus dat de overflow automatisch goed gaat.</edit>
En voor de rest ken ik geen functies van de programmeertaal "small".
Dus ik vrees dat ik toch handmatig de strings moet breaken en er dan weer ints van moet maken en vanuit die situatie moet gaan werken.
Lastig is dat als iets gebasseerd is op een programmeertaal waar zo verrekte weinig over te vinden is
We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.
Verwijderd
Hoeft niet. Je kunt ook de tijd in ms krijgen (sinds 1970 ofzo).Op woensdag 24 juli 2002 23:40 schreef WarMaster het volgende:
Hmmm ja, alleen krijg ik alles in een string uitgepoept.
Ik neem aan dat je [url="http://www.compuphase.com/small.htm"]deze[/url] site kent.En voor de rest ken ik geen functies van de programmeertaal "small".
Dus ik vrees dat ik toch handmatig de strings moet breaken en er dan weer ints van moet maken en vanuit die situatie moet gaan werken.
Als ik jou was zou ik een begin maken met een date/time library. Ik zag dat de integer 32 bits is, dus ik zou de tijd in 2 integers stoppen, 1 voor dagen sinds fixed point (1-1-1970 is populair) en in de andere de seconden sinds middernacht.
En dan maak je er direct een strsplit bij. Ach, zou houd je het interessant
Ik heb een functie ontdekt wat idd het aantal seconden sinds 01-01-1970 0:0:0 telt...
Phew... Dat maakt echt alles een stuk handiger.
We live in a primitive time don't we, neither savage nor wise. Half measures are the curse of it; any rational society would either kill me or put me to some use.