65.9K
CodeProject is changing. Read more.
Home

Stardates in C#

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10 votes)

Aug 5, 2010

CPOL
viewsIcon

21254

Calculate a *Proper* Star Trek style Stardate

Just a little bit of boredom here, and I happened to be watching an episode of Star Trek: TNG, so I decided I would cobble up a little function to calculate a valid stardate. Fairly novel function, but who knows...someone writing a video game could use it.
public double calculateStardate()
{
     DateTime calenderStarTrek = new DateTime(2323, 1, 1, 0, 0, 0);
     // you can replace the DateTime.Now with year values running all
     // the way back to January 1, 1946 at 0:00:00 and still maintain 
     // a positive stardate by virtue of the way the calculation is 
     // done, but this is contingent upon application of a 377 year 
     // offset which puts us into the current Trek year.  Follow the 
     // code for a little bit clearer understanding...
     DateTime presentLocalDate = DateTime.Now;
     // derive the total offset between present date and trek date
     // if we don't do the year offset, we will end up with a date
     // that is in the negative, which while technically correct
     // it's probably not what we want so we adjust the year value
     // of the current date to bring us into the proper Trek year
     presentLocalDate = presentLocalDate.AddYears(377);
 
     TimeSpan timeOffset = presentLocalDate - calenderStarTrek;
     // we divide into a highly granular value to get the most
     // accurate value possible for our calculation.  What we are
     // actually figuring out the average number of seconds in a
     // 4 year leap/non-leap cycle and dividing the total number of
     // milliseconds in our time offset to arrive at our raw stardate
     // value.
     // 
     // we further round this value to 2 decimal places and miliply it
     // by 100 in rounded form, and then divide by 100 to get our two 
     // decimal places back. 2.7 stardate units account for 1 earth day
     // so we do the rounding and multiply / divide operations to get 
     // granularity back into the final date value.
     // 
     // it makes sense when you look at it :-)  trust me.
     double yearValue = timeOffset.TotalMilliseconds / (60 * 60 * 24 * 365.2422);
     double stardate = Math.Floor(yearValue * 100);
     stardate = stardate / 100;
     
     return stardate;
}
Comments, suggestions and code rewrites appreciated. I handle criticism well :-) Cheers.