#!/usr/bin/perl -w # Copyright (c) 2009-2017 Sullivan Beck. All rights reserved. # This program is free software; you can redistribute it and/or modify it # under the same terms as Perl itself. ############################################################################### ############################################################################### require 5.010000; use Date::Manip::Date; use IO::File; use strict; use warnings; ############################################################################### # HELP ############################################################################### our($usage); my $COM = $0; $COM =~ s/^.*\///; $usage= "usage: $COM OPTIONS -h/--help : Print help. Options to tell which date to print (only one of the following should be entered... if none are, 'now' is printed). -d/--date=STRING : Print information about that date. -f/--file=FILE : Print out each date (1/line) in FILE -r/--reference=FILE : Print out the last modification time of FILE Other options -R/--rfc-2822 : Print the date in RFC 2822 format (any +FORMAT string is ignored) Mon, 07 Aug 2006 12:34:56 -0600 -u/--utc/--universal: Converts date(s) to UT time. "; =pod =head1 NAME dm_date - print out the system date and time =head1 SYNOPSIS This performs the same operation as the unix 'date' command, but using the Date::Manip module. dm_date [OPTION]... [+FORMAT] =head1 DESCRIPTION This displays information about the current system time, or some other time. Options are: =over 4 =item -h, --help Print online help. =item -d STRING, --date=STRING Display time described by STRING. STRING can be any string which can be parsed by Date::Manip. Please refer to the Date::Manip::Date documentation for details. =item -f DATEFILE, --file=DATEFILE This reads each line in DATEFILE, and extracts a date from it and prints out the information. Blank lines and lines starting with a pound (#) are ignored. Lines not containing a valid date are also ignored. =item -r FILE, --reference=FILE Displays the last modification time of FILE. =item -R, --rfc-2822 Displayc the date and time in RFC 2822 format. Example: Mon, 07 Aug 2006 12:34:56 -0600 =item -u, --utc, --universal Converts the date to UT (GMT) and prints out the information. =back Only one of -d, -f, or -r should be included. If more than one is included, the first one from the list (-d, -f, -r) is used and any other is ignored. The format string starts with a plus (+) and contains any of the format directives described in Date::Manip::Date. =head1 KNOWN BUGS None known. =head1 BUGS AND QUESTIONS Please refer to the Date::Manip::Problems documentation for information on submitting bug reports or questions to the author. =head1 SEE ALSO Date::Manip::Date =head1 LICENSE This script is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 AUTHOR Sullivan Beck (sbeck@cpan.org) =cut ############################################################################### # PARSE ARGUMENTS ############################################################################### our($date,$file,$ref,$rfc,$ut,$format); while ($_ = shift) { (print $usage), exit if ($_ eq "-h" || $_ eq "--help"); $date = shift, next if ($_ eq "-d" || $_ eq "--date"); $date = $1, next if ($_ =~ /^\-\-date=(.*)/); $file = shift, next if ($_ eq "-f" || $_ eq "--file"); $file = $1, next if ($_ =~ /^\-\-file=(.*)/); $ref = shift, next if ($_ eq "-r" || $_ eq "--reference"); $ref = $1, next if ($_ =~ /^\-\-reference=(.*)/); $rfc = 1, next if ($_ eq "-R" || $_ eq "--rfc-2822"); $ut = 1, next if ($_ eq "-u" || $_ eq "--utc" || $_ eq "--universal"); $format = $_, last if ($_ =~ s/^\+//); die $usage; } if ($rfc) { $format ='%a, %d %b %Y %H:%M:%S %z'; } if (@ARGV || ! $format) { die $usage; } ############################################################################ # MAIN PROGRAM ############################################################################ my $d = new Date::Manip::Date; if ($date) { my $err = $d->parse($date); exit 1 if ($err); $d->convert("GMT") if ($ut); print $d->printf($format),"\n"; } elsif ($file) { my $in = new IO::File; $in->open($file) || die "ERROR: unable to open date file: $file\n\n$usage"; my @in = <$in>; $in->close(); chomp(@in); foreach my $date (@in) { $date =~ s/\#.*//; $date =~ s/\s*$//; next if (! $date); my $err = $d->parse($date); next if ($err); $d->convert("GMT") if ($ut); print $d->printf($format),"\n"; } } elsif ($ref) { if (-e $ref) { my $date = ( stat($ref) )[9]; my $err = $d->parse("epoch $date"); exit if ($err); $d->convert("GMT") if ($ut); print $d->printf($format),"\n"; } } else { my $err = $d->parse("now"); exit 1 if ($err); $d->convert("GMT") if ($ut); print $d->printf($format),"\n"; } # Local Variables: # mode: cperl # indent-tabs-mode: nil # cperl-indent-level: 3 # cperl-continued-statement-offset: 2 # cperl-continued-brace-offset: 0 # cperl-brace-offset: 0 # cperl-brace-imaginary-offset: 0 # cperl-label-offset: 0 # End: