# Timestamp.pm
# Author: Noah Friedman <friedman@splode.com>
# Created: 1997-04-03
# Public domain.

# $Id: Timestamp.pm,v 1.4 2000/02/11 11:25:04 friedman Exp $

# Commentary:
# Code:

package NF::Timestamp;

use strict;

use Exporter;
use vars qw($VERSION @ISA @EXPORT_OK);
$VERSION     = 1.00;
@ISA         = qw(Exporter);
@EXPORT_OK   = qw(ctime timestamp elapsed);


my @weekday = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
my @month   = ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

sub ctime
{
  my $time = (length (@_) > 0)? $_[0] : time ();
  my $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'UTC' ) : '';
  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
      ($TZ eq 'UTC') ? gmtime ($time) : localtime ($time);

  $TZ = $isdst ? $4 : $1
    if ($TZ =~ /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/o);
  $TZ .= " " if ($TZ ne "");

  $year += 1900;
  sprintf ("%s %s %02d %02d:%02d:%02d %s%4d",
           $weekday[$wday], $month[$mon], $mday, $hour, $min, $sec,
           $TZ, $year);
}

sub timestamp (;$$)
{
  my $time = (length (@_) > 0)? $_[0] : time ();
  my $fmt = $_[1];
  my $TZ = defined($ENV{'TZ'}) ? ( $ENV{'TZ'} ? $ENV{'TZ'} : 'UTC' ) : '';
  my ($sec, $min, $hour, $mday, $mon, $year) =
      ($TZ eq 'UTC') ? gmtime ($time) : localtime ($time);

  return sprintf ("%02d:%02d:%02d", $hour, $min, $sec)
    if ($fmt eq "HMS");
  return sprintf ("%04d-%02d-%02d %02d:%02d:%02d",
                  $year+1900, $mon, $mday, $hour, $min, $sec)
    if (!(defined $fmt) || $fmt eq "YMD HMS");
}

sub elapsed ($;$)
{
  my ($seconds, $useconds) = @_;
  my @time_mult = (31536000, 2592000, 86400, 3600,   60,       1);
  my @time_name = ("year",   "month", "day", "hour", "minute", "second");
  my $result = "";
  my $i = 0;

  for ($i = 0; $i <= $#time_mult; $i += 1)
    {
      my $val = int ($seconds / $time_mult[$i]);
      $seconds -= $val * $time_mult[$i];
      if ($val != 0 || (length ($result) == 0 && $i == $#time_mult))
        {
          $result = "$result, " if (length ($result) > 0);
          $result = "$result$val";
          if ($time_name[$i] eq "second" && defined $useconds && $useconds > 0)
            {
              my $frac_seconds = int ($useconds / 10000);
              if ($frac_seconds > 0)
                {
                  $result = sprintf ("%s.%2.2d", $result, $frac_seconds);
                  $val = 2; # to get plural time unit below
                }
            }
          $result = "$result $time_name[$i]";
          $result = "$result" . "s" if ($val != 1);
        }
    }
  return $result;
}

1;
