Datum/Tijd algoritme

Pagina: 1
Acties:

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
*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?

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.


  • Neman
  • Registratie: September 2000
  • Laatst online: 30-08 12:47

Neman

Een uit de lucht gegrepen naam

Die bepaalde tijd moet je converten naar een echte timestamp (aantal sec. na 1 jan. 1970), dat kun je waarschijnlijk doen met een bestaande functie zoals date() (in PHP) of DateTimeToTimeStamp() (in BCB). Vervolgens tel je die Bantime erbij op en check je of de timestamp van de huidige tijd boven je opgetelde timstamp ligt.

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

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.

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.


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

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?
Je moet gewoon rekenen in dag/uren/minuten/seconden vanaf een bepaalde datum (afhankelijk van de nauwkeurigheid).
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.


  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
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.

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.


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

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.
Als het goed is krijg je alleen negatieve waarden als je data van voor je referentie datum gebruikt.
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.


  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
Nou de referentiedatum is dus variabel. Het is OF de currentime, of de timestamp.... Die moeten immers met elkaar vergeleken worden.

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.


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 30-08 17:59

Gerco

Professional Newbie

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.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op 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.
right... alleen jammer dat een jaar geen vast aantal minuten heeft he
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 >:)
scriptrequest? niet bepaald...
Disclaimer: er zijn rekenkundig betere methoden, maar daarvoor is het me nu te laat, en die vergen bovendien iets meer tikwerk. Trusten allemaal :)
zeg dan niets

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.


  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
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.
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?

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.


  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

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?
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.

After all, we are nothing more or less than what we choose to reveal.


Verwijderd

In javascript laat ik het date-object het werk doen :z Voorbeeldcode 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>

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
Op woensdag 24 juli 2002 23:26 schreef Doekman het volgende:
In javascript laat ik het date-object het werk doen :z Voorbeeldcode 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>
Hmmm ja, alleen krijg ik alles in een string uitgepoept.
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

Op woensdag 24 juli 2002 23:40 schreef WarMaster het volgende:
Hmmm ja, alleen krijg ik alles in een string uitgepoept.
Hoeft niet. Je kunt ook de tijd in ms krijgen (sinds 1970 ofzo).
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.
Ik neem aan dat je [url="http://www.compuphase.com/small.htm"]deze[/url] site kent.

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 :)

  • WarMaster
  • Registratie: Juni 1999
  • Niet online

WarMaster

Nosce te ipsum

Topicstarter
Ik heb het...

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.

Pagina: 1