Een sterrendatum (Engels: stardate) is een fictieve tijdseenheid die ontwikkeld werd voor de Star Trek televisieseries en films. Bij aanvang van bijna elke aflevering hoort men een commentaarstem het logboek inspreken, waarbij de sterrendatum van de aflevering vermeld wordt.
Hoewel het idee achter de sterrendatum sterk lijkt op de juliaanse dag1 zoals die door sterrenkundigen gebruikt wordt, hebben schrijvers en producenten van de Star Trek televisieseries en films doorheen de jaren verschillende methoden gebruikt om sterrendatums aan afleveringen of gebeurtenissen toe te kennen, sommige al meer willekeurig dan andere. Dit maakt het onmogelijk om alle sterrendatums om te zetten naar onze tijdrekening, vooral omdat de sterrendatum oorspronkelijk ingevoerd werd om het precieze tijdperk waarin Star Trek zich afspeelt vaag te houden. Het volgende uittreksel uit de Star Trek Guide (17 april 1967, p. 25) geef instructies aan de schrijvers van de oorspronkelijke Star Trek televisieserie2 over hoe ze sterrendatums moeten kiezen voor hun scripts.
We invented "Stardate" to avoid continually mentioning Star Trek's century (actually, about two hundred years from now), and getting into arguments about whether this or that would have developed by then. Pick any combination of four numbers plus a percentage point, use it as your story's stardate. For example, 1313.5 is twelve o'clock noon of one day and 1314.5 would be noon of the next day. Each percentage point is roughly equivalent to one-tenth of one day. The progression of stardates in your script should remain constant but don't worry about whether or not there is a progression from other scripts. Stardates are a mathematical formula which varies depending on location in the galaxy, velocity of travel, and other factors, can vary widely from episode to episode.
Volgens bedenker Gene Roddenberry3 werd de sterrendatum bedacht om te voorkomen dat de gebeurtenissen in de televisieserie naar een specifiek jaar konden herleid worden. Later gaf hij de volgende uitleg:
"This time system adjusts for shifts in relative time which occur due to the vessel's speed and space warp capability. It has little relationship to Earth's time as we know it. One hour aboard the USS Enterprise at different times may equal as little as three Earth hours. The stardates specified in the log entry must be computed against the speed of the vessel, the space warp, and its position within our galaxy, in order to give a meaningful reading."
Later verklaarde Roddenberry dat hij die uitleg zelf niet helemaal begreep, maar dat anderen het een logische verklaring vonden:
"I'm not quite sure what I meant by that explanation, but a lot of people have indicated it makes sense. If so, I've been lucky again, and I'd just as soon forget the whole thing before I'm asked any further questions about it."
Omdat er niet echt een duidelijke redenering achter de sterrendatum zit, is het in de loop van de series en films wel vaker voorgekomen dat gebeurtenissen die later in de tijd gebeurden toch een lagere sterrendatum hadden dan iets wat eerder gebeurde.
We gebruiken twee methoden om een dag uit onze tijdsrekening uit te
drukken als een sterrendatum. De oude methode correspondeert
ongeveer met de sterrendatums die gebruikt werden in de eerste zes Star
Trek films. Hierbij wordt een datum uit onze tijdsrekening voorgesteld in
het formaat YYMM.DD, waarbij YY staat voor het
jaar min 1900, MM voor de maand (01–12)
en DD voor de dag van de maand (01–31).
De waarden worden altijd uitgedrukt met twee cijfers door eventueel
gebruik te maken van een voorloopnul. Zo wordt 8 september 1966 volgens de
oude methode voorgesteld door de sterrendatum 6609.08. Voor
datums later dan het jaar 1999 moeten er extra cijfers voor de jaren
gebruikt worden, waardoor 11 september 2015 volgens de oude methode
voorgesteld wordt door de sterrendatum 11509.11.
Vanaf de film Star Trek XI4 werd een nieuwe methode in gebruik genomen om datums uit onze jaarrekening voor te stellen als een sterrendatum. Hierbij worden datums uitgedrukt in het formaat YYYY.xx, waarbij YYYY staat voor het jaartal uitgedrukt met vier cijfers en .xx voor gepasseerde deel van het jaar uitgedrukt als twee decimale cijfers (aantal honderdsten van een jaar). De laatste twee cijfers kunnen dus bepaald worden door het aantal verstreken dagen te bepalen sinds 1 januari van het jaar (op 1 januari zijn er geen dagen verstreken, op 2 januari is er één dag verstreken, enzoverder), en dit aantal te vermenigvuldigen met honderd en te delen door het totaal aantal dagen van het jaar (rekening houdend met schrikkeljaren). Als men de decimale cijfers buiten beschouwing laat, dan levert dit een waarde op tussen 0 en 99 (grenzen inbegrepen). Zo komt 1 januari 2015 overeen met sterrendatum 2015.00 en 4 juli 2015 met sterrendatum 2015.50 (halverwege het jaar 2015).
Schrijf een bash shell script stardate waarmee een datum uit onze tijdsrekening kan uitgedrukt worden als een sterrendatum. Aan dit script kunnen maximaal drie natuurlijke getallen als argument doorgegeven worden die de gegeven datum aanduiden. Het eerste argument (indien gegeven) staat voor het jaartal. Het tweede argument (indien gegeven) staat voor het maandnummer (januari=1, februari=2, …). Het derde argument (indien gegeven) staat voor de dag van de maand. Als er één of meer van deze argumenten niet worden doorgegeven aan het script, dan moeten de ontbrekende argumenten respectievelijk ingevuld worden door het huidige jaar, de huidige maand en de huidige dag van de maand. Deze standaardwaarden moeten door het script zelf bepaald worden (met andere woorden, vandaag zijn de standaardwaarden anders dan morgen).
Het script moet de volgende opties ondersteunen:
optie -n: schrijf de sterrendatum uit volgens de nieuwe methode; standaard wordt de sterrendatum volgens de oude methode uitgeschreven
optie -s <char>: gebruik <char> als scheidingsteken bij het uitschrijven van de sterrendatum; standaard wordt een punt (.) gebruikt als scheidingsteken
Het script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, gebruik van -- om opties en argumenten van elkaar te scheiden, ….
Als het script niet de correcte opties of argumenten meekrijgt (enkel ondersteuning voor de opties -n en -s, waarbij verplicht een argument moet doorgegeven worden aan de optie -s; maximaal drie argumenten), dan moet het script een boodschap uitschrijven naar stderr en eindigen met exit status 1. Die boodschap vind je terug in onderstaand voorbeeld. Als er geen fouten optreden dan moet het script eindigen met exit status 0.
Let goed op het aantal dagen in een jaar.
$ date -d '2016-12-31' +'%j'
366
$ date -d '2017-12-31' +'%j'
365
Getallen die beginnen met een 0 worden gezien als octale5 getallen.
$ dagen=$(date -d '2013-05-03' +'%j'); echo $dagen
123
$ echo $((dagen-1))
122
$ dagen=$(date -d '2013-04-03' +'%j'); echo $dagen
093
$ echo $((dagen-1))
bash: 093: value too great for base (error token is "093")
Onderstaande voorbeeldsessie geeft aan hoe het bash shell script stardate moet kunnen gebruikt worden. Hierbij moet je ervan uitgaan dat deze voorbeeldsessie werd uitgevoerd op 15 december 2015.
$ date +'%Y-%m-%d'
2015-12-15
$ stardate 1959 9 13
5909.13
$ stardate 1959 9 # day=15
5909.15
$ stardate 1959 # month=12, day=15
5912.15
$ stardate # year=2015, month=12, day=15
11512.15
$ stardate -n 1959 9 13
1959.69
$ stardate -n 1959 9 # day=15
1959.70
$ stardate -n 1959 # month=12, day=15
1959.95
$ stardate -n # year=2015, month=12, day=15
2015.95
$ stardate -ns- 1959 9 13
1959-69
$ stardate -s/ -n 1959 9 13
1959/69
$ stardate 1 2 3 4
Usage: stardate [-n] [-s separator] [year [month [day]]]
$ echo $?
1
$ stardate -p 1959 9 13
Usage: stardate [-n] [-s separator] [year [month [day]]]
$ echo $?
1