Data Stellare

Calcolo della “Data Stellare”, usata in “Star Trek”, in ASP - PHP - JavaScript

(Testo tratto da Wikipedia - http://it.wikipedia.org/wiki/Data_stellare)

Nel corso della serie classica di Star Trek (TOS) la data stellare veniva assegnata del tutto casualmente. Solo successivamente, con la serie Star Trek - The Next Generation (TNG) si iniziò ad utilizzare un algoritmo per il calcolo della data stellare: la prima cifra è sempre 4, e la seconda cifra corrisponde al numero della stagione alla quale appartiene l'episodio in questione. Le ultime tre cifre prima del punto vanno da 000 a 999 a seconda del momento della stagione nel quale si trova l'episodio. Le cifre dopo il punto sono completamente casuali.

A causa della mancanza di un metodo ufficiale per calcolare la data stellare in modo matematico (piuttosto che casuale e/o legato ad un episodio) sono stati sviluppati da fan della serie dei metodi alternativi.

(Testo tratto da Wikipedia - http://it.wikipedia.org/wiki/Data_stellare)

I seguenti metodi per calcolare la data stellare, ovviamente non ufficiali, sono fra quelli più utilizzati dalle varie comunità di fan sparse per il mondo. Questi metodi alternativi nascono dal fatto che, a differenza della notazione ufficiale, sono slegati dal concetto di “stagione-puntata” e quindi sono utilizzabili per convertire qualsiasi data standard.

Un'approssimazione di questa formula è stata pubblicata per la prima volta da Wilford Nusser, questo metodo si basa sul principio per il quale 1000 unità di data stellare corrispondono ad un anno standard. Da ciò deriva quindi la formula.

K * SecondiTrascorsi

dove K è il rapporto fra 1000 e i secondi che compongono un anno. È ovvio quindi che la costante sarà diversa a seconda che ci troviamo in un anno bisestile o no.

Il valore si approssima quindi in:

  • K (normale) = 3.170979 x 10-5
  • K (bisestile) = 3.162315 x 10-5

Come si può notare la differenza è incredibilmente piccola. È altrettanto evidente che la formula sopra indicata mal si presta ad un uso istantaneo e può assere meglio esplicitata nella seguente:

Nella quale:

  • Anno è l'anno corrente.
  • AnnoBase è una specie di anno zero. Viene di solito usato l'anno di fondazione della Federazione Unita dei Pianeti; tuttavia alcuni fan usano anche il 2000 come anno base o l'anno della propria nascita, così da risolvere l'inconveniente della data stellare negativa.
  • Giorno è il numero di giorni trascorso dall'inizio dell'anno.
  • GiorniAnno è il numero totale di giorni che compongono l'anno (365 o 366).
  • Ora è l'ora di quando si vuole trovare la data stellare espressa nel formato 24h.
  • Minuti sono i minuti.
  • Secondi sono i secondi, anche se spesso quest'ultima variabile viene del tutto esclusa poiché è di scarsa influenza.
  • K è la costante.

Adesso avendo tutte le informazioni necessarie, creiamo gli script che calcoleranno la data stellare in automatico in modo da utilizzarli in una pagina web di un blog o per far divertire i vostri amici fan di Star Trek.

Data Stellare nei principali linguaggi di programmazione

Codice

<%
dim k
 
dim sData = date()
dim sOrario = time()
 
dim iAnno = year(sData)
dim iAnnoBase = "2323"
dim iGiorno = DateDiff("d", "01/01/" & iAnno, sData)
dim iGiorniAnno = DateDiff("d", "01/01/" & iAnno, "01/01/" & iAnno + 1)
dim iOra = hour(sOrario)
dim iMinuti = minute(sOrario)
dim iSecondi = second(sOrario)
 
dim iAnnoNormale = "0,00003170979"
dim iAnnoBisestile = "0,00003162315"
 
if iGiorniAnno = "365" then
  set k = iAnnoNormale
elseif iGiorniAnno = "366" then
  set k = iAnnoBisestile
end if
 
dim sStardate = (((iAnno - iAnnoBase) + cdbl(iGiorno / iGiorniAnno)) * 1000) + (((iOra * 3600) + (iMinuti * 60) + iSecondi) * k)
 
dim aStardate = split(sStardate, ",")
dim sShortStardate = aStardate(0) & "." & left(aStardate(1), 2)
%>

Spiegazione

  • Le righe dalla 2 alla 14 vengono utilizzate per impostare le variabili che useremo nella formula (riga 22).
  • La funzione DateDiff() calcola i giorni passati dall'inizio dell'anno (riga 7) e i giorni che compongono l'anno corrente (riga 8).
  • Un semplice condizionale (riga 16) imposta la costante “k” per utilizzarla in caso l'anno corrente fosse bisestile o no.
  • La riga 22, calcola la data stellare utilizzando la formula descritta sopra, da notare l'uso di cdbl() usato per convertire il risultato della divisione giorno / giorniAnno in un valore “double”.
  • Le righe 24 e 25 non fanno altro che rendere più leggibile la data stellare, riducendo i numeri dopo la virgola a due e mettendo il punto al posto della virgola.

Utilizzo

Salviamo il codice della formula, all'interno di un file chiamato stardate.asp e includiamolo all'interno della pagina della nostra applicazione ASP, ad esempio:

<!-- #include file = "stardate.asp" -->
<html>
  <head>
    <title>Data Stellare</title>
  <head>
  <body>
  Oggi è la data stellare <% response.write sShortStardate %>
  </body>
</html>

Codice

<?php
$data = date("y-m-d");
 
$anno       = date('Y');
$annoBase   = 2323;
$giorno     = (int)(abs(strtotime($data) - strtotime($anno."-01-01")) / (86400)) + 1;
$giorniAnno = (int)(abs(strtotime(($anno + 1)."-01-01") - strtotime($anno."-01-01")) / (86400));
$ora        = date('G');
$minuti     = date('i');
$secondi    = date('s');
 
$anno_normale   = "0.00003170979";
$anno_bisestile = "0.00003162315";
 
if ($giorniAnno == 365) {
     $k = $anno_normale;
} elseif ($giorniAnno == 366) {
     $k = $anno_bisestile;
}
 
$stardate = ((($anno - $annoBase) + ($giorno / $giorniAnno)) * 1000) + ((($ora * 3600) + ($minuti * 60) + $secondi) * $k);
 
$arr_stardate = split("[.]",$stardate);
$short_stardate = $arr_stardate[0].".".substr($arr_stardate[1], 0, 2);
?>

Spiegazione

  • Le righe dalla 2 alla 10 vengono utilizzate per impostare le variabili che useremo nella formula (riga 21).
  • Con l'aiuto di strtotime() si calcolano i giorni passati dall'inizio dell'anno (riga 6) e i giorni che compongono l'anno corrente (riga 7).
  • Un semplice condizionale (riga 15) imposta la costante “k” per utilizzarla in caso l'anno corrente fosse bisestile o no.
  • La riga 21, calcola la data stellare utilizzando la formula descritta sopra
  • Le righe 23 e 24 non fanno altro che rendere più leggibile la data stellare, riducendo i numeri dopo la virgola a due e mettendo il punto al posto della virgola.

Utilizzo

Salviamo il codice della formula, all'interno di un file chiamato stardate.php e includiamolo all'interno della pagina della nostra applicazione PHP, ad esempio:

<?php include("stardate.php"); ?>
<html>
  <head>
    <title>Data Stellare</title>
  <head>
  <body>
  Oggi è la data stellare <?php echo $short_stardate; ?>
  </body>
</html>

JavaScript è un linguaggio molto comodo, perchè ci permette di aggiornare il valore della data in modo automatico, cosa che un linguaggio lato server (PHP o ASP) non può fare, senza dover ricaricare la pagina ogni volta.

Codice

function StarDate() {
 
  var oggi  = new Date(),
      day   = oggi.getDate(),
      month = oggi.getMonth(),
      year  = oggi.getYear();
 
  if (year < 1000)
     var anno = (oggi.getYear() + 1900);
  else if (year > 1000)
     var anno = year;
 
  var annoBase = "2323";
  var giorno = parseInt((((Date.parse((month + 1) + "/" + day + "/" + anno) - Date.parse("01/01/" + anno))/86400)/1000)+1);
  var giorniAnno = (((Date.parse("01/01/" + (anno + 1)) - Date.parse("01/01/" + anno))/86400)/1000);
  var ora = oggi.getHours();
  var minuti = oggi.getMinutes();
  var secondi = oggi.getSeconds();
 
  var anno_normale   = 0.00003170979,
      anno_bisestile = 0.00003162315;
 
  if (giorniAnno == 365)
     var k = anno_normale;
  else if (giorniAnno == 366)
     var k = anno_bisestile;
 
  var stardate = (((anno - annoBase) + (giorno / giorniAnno)) * 1000) + (((ora * 3600) + (minuti * 60) + secondi) * k);
 
  var stardate_string = stardate + '';
 
  var arr_stardate = stardate_string.split(".");
  var short_stardate = arr_stardate[0] + "." + arr_stardate[1].substring(0, 2);
 
  document.getElementById('StarDate').value = (stardate);
 
  setTimeout("StarDate()",1000);
 
}

Spiegazione

  • Le righe dalla 3 alla 19 vengono utilizzate per impostare le variabili che useremo nella formula (riga 29).
  • Il condizionale della riga 9 risolve l'errore della cifra dell'anno dopo il 2000, che alcuni browser non interpretano bene.
  • Un semplice condizionale (riga 24) imposta la costante “k” per utilizzarla in caso l'anno corrente fosse bisestile o no.
  • La riga 29, calcola la data stellare utilizzando la formula descritta sopra.
  • La riga 31 converte il risultato della formula in una stringa.
  • Le righe 33 e 34 non fanno altro che rendere più leggibile la data stellare, riducendo i numeri dopo la virgola a due e mettendo il punto al posto della virgola.
  • La riga 36 indica quale ID usare per scrivere la data stellare

Utilizzo

Salviamo il codice della formula, all'interno di un file chiamato stardate.js e richiamiamolo con il tag <script></script> dall'interno della pagina e usiamo una text form per scrivere la data, ad esempio:

<html>
  <head>
    <title>Data Stellare</title>
    <script language="JavaScript" src="stardate.js"></script>
  <head>
  <body onload="StarDate()">
  Oggi è la data stellare <input type="text" id="StarDate" />
  </body>
</html>

Considerazioni finali

Come potete notare calcolare la Data Stellare, utilizzando come “anno base” l'anno della fondazione della Federazione Unita dei Pianeti (anno 2323), porterà come risultato un numero negativo che via via, avvicinandosi a quell'anno, si fa sempre più piccolo.

Un modo per avere sempre un numero positivo è utilizzare come “anno base”, l'anno 2000 oppure il nostro anno di nascita oppure l'anno della prima messa in onda di Star Trek (anno 1966).

"Diario di bordo. Data Stellare 54973.4 . Supplemento."

Un escamotage per rendere più gradevole la data stellare negativa, senza modificare l'anno base 2323, è l'uso di parentesi quadre nelle prime due cifre. Ad esempio:

[-30]8674.27

Basterà aggiungere le seguenti righe alla fine del nostro codice:

  • ASP Classic:
dim sStardate2 = "[" & left(sShortStardate, 3) & "]" & mid(sShortStardate, 4, 10)
  • PHP:
$stardate2 = "[".substr($short_stardate, 0, 3)."]".substr($short_stardate, 3, 10);
  • JavaScript:
var stardate2 = "[" + short_stardate.substr(0, 3) + "]" + short_stardate.substr(3, 10);

ed aggiornare la riga 36 del file stardate.js così:

document.getElementById('StarDate').value = (stardate2);