| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- package Time::CTime;
- require 5.000;
- use Time::Timezone;
- use Time::CTime;
- require Exporter;
- @ISA = qw(Exporter);
- @EXPORT = qw(ctime asctime strftime);
- @EXPORT_OK = qw(asctime_n ctime_n @DoW @MoY @DayOfWeek @MonthOfYear);
- use strict;
- # constants
- use vars qw(@DoW @DayOfWeek @MoY @MonthOfYear %strftime_conversion $VERSION);
- use vars qw($template $sec $min $hour $mday $mon $year $wday $yday $isdst);
- $VERSION = 2011.0505;
- CONFIG: {
- @DoW = qw(Sun Mon Tue Wed Thu Fri Sat);
- @DayOfWeek = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
- @MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
- @MonthOfYear = qw(January February March April May June
- July August September October November December);
-
- %strftime_conversion = (
- '%', sub { '%' },
- 'a', sub { $DoW[$wday] },
- 'A', sub { $DayOfWeek[$wday] },
- 'b', sub { $MoY[$mon] },
- 'B', sub { $MonthOfYear[$mon] },
- 'c', sub { asctime_n($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, "") },
- 'd', sub { sprintf("%02d", $mday); },
- 'D', sub { sprintf("%02d/%02d/%02d", $mon+1, $mday, $year%100) },
- 'e', sub { sprintf("%2d", $mday); },
- 'f', sub { fracprintf ("%3.3f", $sec); },
- 'F', sub { fracprintf ("%6.6f", $sec); },
- 'h', sub { $MoY[$mon] },
- 'H', sub { sprintf("%02d", $hour) },
- 'I', sub { sprintf("%02d", $hour % 12 || 12) },
- 'j', sub { sprintf("%03d", $yday + 1) },
- 'k', sub { sprintf("%2d", $hour); },
- 'l', sub { sprintf("%2d", $hour % 12 || 12) },
- 'm', sub { sprintf("%02d", $mon+1); },
- 'M', sub { sprintf("%02d", $min) },
- 'n', sub { "\n" },
- 'o', sub { sprintf("%d%s", $mday, (($mday < 20 && $mday > 3) ? 'th' : ($mday%10 == 1 ? "st" : ($mday%10 == 2 ? "nd" : ($mday%10 == 3 ? "rd" : "th"))))) },
- 'p', sub { $hour > 11 ? "PM" : "AM" },
- 'r', sub { sprintf("%02d:%02d:%02d %s", $hour % 12 || 12, $min, $sec, $hour > 11 ? 'PM' : 'AM') },
- 'R', sub { sprintf("%02d:%02d", $hour, $min) },
- 'S', sub { sprintf("%02d", $sec) },
- 't', sub { "\t" },
- 'T', sub { sprintf("%02d:%02d:%02d", $hour, $min, $sec) },
- 'U', sub { wkyr(0, $wday, $yday) },
- 'v', sub { sprintf("%2d-%s-%4d", $mday, $MoY[$mon], $year+1900) },
- 'w', sub { $wday },
- 'W', sub { wkyr(1, $wday, $yday) },
- 'y', sub { sprintf("%02d",$year%100) },
- 'Y', sub { $year + 1900 },
- 'x', sub { sprintf("%02d/%02d/%02d", $mon + 1, $mday, $year%100) },
- 'X', sub { sprintf("%02d:%02d:%02d", $hour, $min, $sec) },
- 'Z', sub { &tz2zone(undef,undef,$isdst) }
- # z sprintf("%+03d%02d", $offset / 3600, ($offset % 3600)/60);
- );
- }
- sub fracprintf {
- my($t,$s) = @_;
- my($p) = sprintf($t, $s-int($s));
- $p=~s/^0+//;
- $p;
- }
- sub asctime_n {
- my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $TZname) = @_;
- ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $TZname) = localtime($sec) unless defined $min;
- $year += 1900;
- $TZname .= ' '
- if $TZname;
- sprintf("%s %s %2d %2d:%02d:%02d %s%4d",
- $DoW[$wday], $MoY[$mon], $mday, $hour, $min, $sec, $TZname, $year);
- }
- sub asctime
- {
- return asctime_n(@_)."\n";
- }
- # is this formula right?
- sub wkyr {
- my($wstart, $wday, $yday) = @_;
- $wday = ($wday + 7 - $wstart) % 7;
- return int(($yday - $wday + 13) / 7 - 1);
- }
- # ctime($time)
- sub ctime {
- my($time) = @_;
- asctime(localtime($time), &tz2zone(undef,$time));
- }
- sub ctime_n {
- my($time) = @_;
- asctime_n(localtime($time), &tz2zone(undef,$time));
- }
- # strftime($template, @time_struct)
- #
- # Does not support locales
- sub strftime {
- local ($template, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = @_;
- undef $@;
- $template =~ s/%([%aAbBcdDefFhHIjklmMnopQrRStTUvwWxXyYZ])/&{$Time::CTime::strftime_conversion{$1}}()/egs;
- die $@ if $@;
- return $template;
- }
- 1;
- __END__
- =head1 NAME
- Time::CTime -- format times ala POSIX asctime
- =head1 SYNOPSIS
- use Time::CTime
- print ctime(time);
- print asctime(localtime(time));
- print strftime(template, localtime(time));
- =head2 strftime conversions
- %% PERCENT
- %a day of the week abbr
- %A day of the week
- %b month abbr
- %B month
- %c ctime format: Sat Nov 19 21:05:57 1994
- %d DD
- %D MM/DD/YY
- %e numeric day of the month
- %f floating point seconds (milliseconds): .314
- %F floating point seconds (microseconds): .314159
- %h month abbr
- %H hour, 24 hour clock, leading 0's)
- %I hour, 12 hour clock, leading 0's)
- %j day of the year
- %k hour
- %l hour, 12 hour clock
- %m month number, starting with 1, leading 0's
- %M minute, leading 0's
- %n NEWLINE
- %o ornate day of month -- "1st", "2nd", "25th", etc.
- %p AM or PM
- %r time format: 09:05:57 PM
- %R time format: 21:05
- %S seconds, leading 0's
- %t TAB
- %T time format: 21:05:57
- %U week number, Sunday as first day of week
- %v DD-Mon-Year
- %w day of the week, numerically, Sunday == 0
- %W week number, Monday as first day of week
- %x date format: 11/19/94
- %X time format: 21:05:57
- %y year (2 digits)
- %Y year (4 digits)
- %Z timezone in ascii. eg: PST
- =head1 DESCRIPTION
- This module provides routines to format dates. They correspond
- to the libc routines. &strftime() supports a pretty good set of
- conversions -- more than most C libraries.
-
- strftime supports a pretty good set of conversions.
- The POSIX module has very similar functionality. You should consider
- using it instead if you do not have allergic reactions to system
- libraries.
- =head1 GENESIS
- Written by David Muir Sharnoff <[email protected]>.
- The starting point for this package was a posting by
- Paul Foley <[email protected]>
- =head1 LICENSE
- Copyright (C) 1996-2010 David Muir Sharnoff.
- Copyright (C) 2011 Google, Inc.
- License hereby
- granted for anyone to use, modify or redistribute this module at
- their own risk. Please feed useful changes back to [email protected].
|