1package Time::CTime; 2 3 4require 5.000; 5 6use Time::Timezone; 7use Time::CTime; 8require Exporter; 9@ISA = qw(Exporter); 10@EXPORT = qw(ctime asctime strftime); 11@EXPORT_OK = qw(asctime_n ctime_n @DoW @MoY @DayOfWeek @MonthOfYear); 12 13use strict; 14 15# constants 16use vars qw(@DoW @DayOfWeek @MoY @MonthOfYear %strftime_conversion $VERSION); 17use vars qw($template $sec $min $hour $mday $mon $year $wday $yday $isdst); 18 19$VERSION = 2011.0505; 20 21CONFIG: { 22 @DoW = qw(Sun Mon Tue Wed Thu Fri Sat); 23 @DayOfWeek = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday); 24 @MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); 25 @MonthOfYear = qw(January February March April May June 26 July August September October November December); 27 28 %strftime_conversion = ( 29 '%', sub { '%' }, 30 'a', sub { $DoW[$wday] }, 31 'A', sub { $DayOfWeek[$wday] }, 32 'b', sub { $MoY[$mon] }, 33 'B', sub { $MonthOfYear[$mon] }, 34 'c', sub { asctime_n($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, "") }, 35 'd', sub { sprintf("%02d", $mday); }, 36 'D', sub { sprintf("%02d/%02d/%02d", $mon+1, $mday, $year%100) }, 37 'e', sub { sprintf("%2d", $mday); }, 38 'f', sub { fracprintf ("%3.3f", $sec); }, 39 'F', sub { fracprintf ("%6.6f", $sec); }, 40 'h', sub { $MoY[$mon] }, 41 'H', sub { sprintf("%02d", $hour) }, 42 'I', sub { sprintf("%02d", $hour % 12 || 12) }, 43 'j', sub { sprintf("%03d", $yday + 1) }, 44 'k', sub { sprintf("%2d", $hour); }, 45 'l', sub { sprintf("%2d", $hour % 12 || 12) }, 46 'm', sub { sprintf("%02d", $mon+1); }, 47 'M', sub { sprintf("%02d", $min) }, 48 'n', sub { "\n" }, 49 'o', sub { sprintf("%d%s", $mday, (($mday < 20 && $mday > 3) ? 'th' : ($mday%10 == 1 ? "st" : ($mday%10 == 2 ? "nd" : ($mday%10 == 3 ? "rd" : "th"))))) }, 50 'p', sub { $hour > 11 ? "PM" : "AM" }, 51 'r', sub { sprintf("%02d:%02d:%02d %s", $hour % 12 || 12, $min, $sec, $hour > 11 ? 'PM' : 'AM') }, 52 'R', sub { sprintf("%02d:%02d", $hour, $min) }, 53 'S', sub { sprintf("%02d", $sec) }, 54 't', sub { "\t" }, 55 'T', sub { sprintf("%02d:%02d:%02d", $hour, $min, $sec) }, 56 'U', sub { wkyr(0, $wday, $yday) }, 57 'v', sub { sprintf("%2d-%s-%4d", $mday, $MoY[$mon], $year+1900) }, 58 'w', sub { $wday }, 59 'W', sub { wkyr(1, $wday, $yday) }, 60 'y', sub { sprintf("%02d",$year%100) }, 61 'Y', sub { $year + 1900 }, 62 'x', sub { sprintf("%02d/%02d/%02d", $mon + 1, $mday, $year%100) }, 63 'X', sub { sprintf("%02d:%02d:%02d", $hour, $min, $sec) }, 64 'Z', sub { &tz2zone(undef,undef,$isdst) } 65 # z sprintf("%+03d%02d", $offset / 3600, ($offset % 3600)/60); 66 ); 67 68 69} 70 71sub fracprintf { 72 my($t,$s) = @_; 73 my($p) = sprintf($t, $s-int($s)); 74 $p=~s/^0+//; 75 $p; 76} 77 78sub asctime_n { 79 my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $TZname) = @_; 80 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst, $TZname) = localtime($sec) unless defined $min; 81 $year += 1900; 82 $TZname .= ' ' 83 if $TZname; 84 sprintf("%s %s %2d %2d:%02d:%02d %s%4d", 85 $DoW[$wday], $MoY[$mon], $mday, $hour, $min, $sec, $TZname, $year); 86} 87 88sub asctime 89{ 90 return asctime_n(@_)."\n"; 91} 92 93# is this formula right? 94sub wkyr { 95 my($wstart, $wday, $yday) = @_; 96 $wday = ($wday + 7 - $wstart) % 7; 97 return int(($yday - $wday + 13) / 7 - 1); 98} 99 100# ctime($time) 101 102sub ctime { 103 my($time) = @_; 104 asctime(localtime($time), &tz2zone(undef,$time)); 105} 106 107sub ctime_n { 108 my($time) = @_; 109 asctime_n(localtime($time), &tz2zone(undef,$time)); 110} 111 112# strftime($template, @time_struct) 113# 114# Does not support locales 115 116sub strftime { 117 local ($template, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = @_; 118 119 undef $@; 120 $template =~ s/%([%aAbBcdDefFhHIjklmMnopQrRStTUvwWxXyYZ])/&{$Time::CTime::strftime_conversion{$1}}()/egs; 121 die $@ if $@; 122 return $template; 123} 124 1251; 126 127__END__ 128 129=head1 NAME 130 131Time::CTime -- format times ala POSIX asctime 132 133=head1 SYNOPSIS 134 135 use Time::CTime 136 print ctime(time); 137 print asctime(localtime(time)); 138 print strftime(template, localtime(time)); 139 140=head2 strftime conversions 141 142 %% PERCENT 143 %a day of the week abbr 144 %A day of the week 145 %b month abbr 146 %B month 147 %c ctime format: Sat Nov 19 21:05:57 1994 148 %d DD 149 %D MM/DD/YY 150 %e numeric day of the month 151 %f floating point seconds (milliseconds): .314 152 %F floating point seconds (microseconds): .314159 153 %h month abbr 154 %H hour, 24 hour clock, leading 0's) 155 %I hour, 12 hour clock, leading 0's) 156 %j day of the year 157 %k hour 158 %l hour, 12 hour clock 159 %m month number, starting with 1, leading 0's 160 %M minute, leading 0's 161 %n NEWLINE 162 %o ornate day of month -- "1st", "2nd", "25th", etc. 163 %p AM or PM 164 %r time format: 09:05:57 PM 165 %R time format: 21:05 166 %S seconds, leading 0's 167 %t TAB 168 %T time format: 21:05:57 169 %U week number, Sunday as first day of week 170 %v DD-Mon-Year 171 %w day of the week, numerically, Sunday == 0 172 %W week number, Monday as first day of week 173 %x date format: 11/19/94 174 %X time format: 21:05:57 175 %y year (2 digits) 176 %Y year (4 digits) 177 %Z timezone in ascii. eg: PST 178 179=head1 DESCRIPTION 180 181This module provides routines to format dates. They correspond 182to the libc routines. &strftime() supports a pretty good set of 183coversions -- more than most C libraries. 184 185strftime supports a pretty good set of conversions. 186 187The POSIX module has very similar functionality. You should consider 188using it instead if you do not have allergic reactions to system 189libraries. 190 191=head1 GENESIS 192 193Written by David Muir Sharnoff <muir@idiom.org>. 194 195The starting point for this package was a posting by 196Paul Foley <paul@ascent.com> 197 198=head1 LICENSE 199 200Copyright (C) 1996-2010 David Muir Sharnoff. 201Copyright (C) 2011 Google, Inc. 202License hereby 203granted for anyone to use, modify or redistribute this module at 204their own risk. Please feed useful changes back to cpan@dave.sharnoff.org. 205 206