- my ($sec,$min,$hour,$mday,$mon,$year) = gmtime(time);
- $year += 1900;
- my $buf = sprintf "%02d%s%04d\@%02d:%02d:%02d", $mday, $month[$mon], $year, $hour, $min, $sec;
- return $buf;
+ my $t = shift;
+ my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time);
+ $year += 1900;
+ my $buf = sprintf "%02d%s%04d\@%02d:%02d:%02d", $mday, $month[$mon], $year, $hour, $min, $sec;
+ return $buf;
+}
+
+# get a zulu time in cluster format (2300Z)
+sub ztime
+{
+ my $t = shift;
+ my ($sec,$min,$hour) = gmtime((defined $t) ? $t : time);
+ $year += 1900;
+ my $buf = sprintf "%02d%02dZ", $hour, $min;
+ return $buf;
+
+}
+
+# get a cluster format date (23-Jun-1998)
+sub cldate
+{
+ my $t = shift;
+ my ($sec,$min,$hour,$mday,$mon,$year) = gmtime((defined $t) ? $t : time);
+ $year += 1900;
+ my $buf = sprintf "%2d-%s-%04d", $mday, $month[$mon], $year;
+ return $buf;
+}
+
+# return a cluster style date time
+sub cldatetime
+{
+ my $t = shift;
+ my $date = cldate($t);
+ my $time = ztime($t);
+ return "$date $time";
+}
+
+# return a unix date from a cluster date and time
+sub cltounix
+{
+ my $date = shift;
+ my $time = shift;
+ my ($thisyear) = (gmtime)[5] + 1900;
+
+ return 0 unless $date =~ /^\s*(\d+)-(\w\w\w)-([12][90]\d\d)$/;
+ return 0 if $3 > 2036;
+ return 0 unless abs($thisyear-$3) <= 1;
+ $date = "$1 $2 $3";
+ return 0 unless $time =~ /^([012]\d)([012345]\d)Z$/;
+ $time = "$1:$2 +0000";
+ return str2time("$date $time");
+}
+
+# turn a latitude in degrees into a string
+sub slat
+{
+ my $n = shift;
+ my ($deg, $min, $let);
+ $let = $n >= 0 ? 'N' : 'S';
+ $n = abs $n;
+ $deg = int $n;
+ $min = int ((($n - $deg) * 60) + 0.5);
+ return "$deg $min $let";