#!/usr/bin/perl # This product includes software developed by Scott M Harrison (mailto://scott@mithrandir.com). # Ported to perl and expanded by Troy Davis (mailto://troy@digissance.com) use strict; use Switch; use Time::Local; use Data::Dumper; print tranquility_date() . "\n"; exit(); sub tranquility_date() { my ($dayOfYear, $yearOfCommonEra) = @_; my $show_date = 0; my ($second,$minute,$hour,$dayOfMonth,$month,$dayOfWeek); if (($dayOfYear =! /^\d+/) && ($dayOfYear > 0) && ($dayOfYear < 367) && ($yearOfCommonEra =~ /^(-{1})*\d+$/)) { # Values passed in look legit } else { # Assume now in UTC time zone, Gregorian calendar $ENV{TZ} = ':/usr/share/zoneinfo/UTC'; ($second,$minute,$hour,$dayOfMonth,$month,$yearOfCommonEra,$dayOfWeek,$dayOfYear) = localtime(); $dayOfYear++; $yearOfCommonEra += 1900; $show_date = 1; } my @daysOfWeek = ( "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday" ); my @months = ( "Archimedes", "Brahe", "Copernicus", "Darwin", "Einstein", "Faraday", "Galileo", "Hippocrates", "Imhotep", "Jung", "Kepler", "Lavoisier", "Mendel" ); my $daysInNonLeapYear = 365; my $daysInTranquilityMonth = 28; my $aldrinDay = 60; my $armstrongDay = 201; my $yearOfTranquility = 1969; my $isLeapYear = ( (($yearOfCommonEra % 4) == 0) && (($yearOfCommonEra % 400) != 100) && (($yearOfCommonEra % 400) != 200) && (($yearOfCommonEra % 400) != 300) ); my $tranquilityDayOfYear = 0; my $specialDay = 0; my $day = 0; my $month = 1; my $year; my $afterArmstrongDay = $dayOfYear > $armstrongDay; if ($isLeapYear) { if ($dayOfYear > $aldrinDay) { $dayOfYear--; } elsif ($dayOfYear == $aldrinDay) { $specialDay = 1; } } if ($dayOfYear == $armstrongDay) { $specialDay = 2; } $tranquilityDayOfYear = $dayOfYear - $armstrongDay + ($afterArmstrongDay ? 0 : $daysInNonLeapYear); if ($specialDay == 0) { $month = sprintf("%d", ($tranquilityDayOfYear - 1) / $daysInTranquilityMonth); $day = $tranquilityDayOfYear - $month * $daysInTranquilityMonth; } elsif (($yearOfCommonEra == $yearOfTranquility) && ($specialDay == 2)) { $specialDay = 3; } $year = $yearOfCommonEra - $yearOfTranquility + ($afterArmstrongDay ? 1 : 0); if ($year <= 0) { $year--; } my $out = ''; switch ($specialDay) { case 0 { $out .= $daysOfWeek[$day % 7] . ', ' . $months[$month] . " " . $day . ","; next } case 1 { $out .= "Aldrin Day $year"; next } case 2 { $out .= "Armstrong Day $year"; next } case 3 { $out .= "Moon Landing Day"; } } if (3 != $specialDay) { $out .= sprintf(" %d", abs($year)); if ($year < 0) { $out .= " BT"; } } if ($show_date) { $out .= " " . sprintf("%02d", $hour) . ':' . sprintf("%02d", $minute) . ':' . sprintf("%02d", $second) . " UTC"; } return $out; }