Initial commit
[clearscm.git] / maps / bin / MAPSUtil.pm
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         $RCSfile: MAPSUtil.pm,v $
5 # Revision:     $Revision: 1.1 $
6 # Description:  MAPS Utilities
7 # Author:       Andrew@DeFaria.com
8 # Created:      Fri Nov 29 14:17:21  2002
9 # Modified:     $Date: 2013/06/12 14:05:47 $
10 # Language:     perl
11 #
12 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
13 #
14 ################################################################################
15 package MAPSUtil;
16
17 use strict;
18 use vars qw (@ISA @EXPORT);
19
20 @ISA = qw (Exporter);
21
22 @EXPORT = qw (
23   FormatDate
24   FormatTime
25   SQLDatetime2UnixDatetime
26   SubtractDays
27   Today2SQLDatetime
28   UnixDatetime2SQLDatetime
29 );
30
31 # Forwards
32 sub FormatDate;
33 sub FormatTime;
34 sub SQLDatetime2UnixDatetime;
35 sub SubtractDays;
36 sub Today2SQLDatetime;
37 sub UnixDatetime2SQLDatetime;
38
39 sub FormatDate {
40   my $date = shift;
41
42   return substr ($date, 5, 2)   .
43          "/"                    .
44          substr ($date, 8, 2)   .
45          "/"                    .
46          substr ($date, 0, 4);
47 } # FormatDate
48
49 sub FormatTime {
50   my $time = shift;
51
52   my $hours     = substr $time, 0, 2;
53   my $minutes   = substr $time, 3, 2;
54   my $AmPm      = $hours > 12 ? "Pm" : "Am";
55
56   $hours = $hours - 12 if $hours > 12;
57
58   return "$hours:$minutes $AmPm";
59 } # FormatTime
60
61 sub SQLDatetime2UnixDatetime {
62   my $sqldatetime = shift;
63
64   my %months = (
65     "01" => "Jan",
66     "02" => "Feb",
67     "03" => "Mar",
68     "04" => "Apr",
69     "05" => "May",
70     "06" => "Jun",
71     "07" => "Jul",
72     "08" => "Aug",
73     "09" => "Sep",
74     "10" => "Oct",
75     "11" => "Nov",
76     "12" => "Dec"
77   );
78
79   my $year  = substr $sqldatetime, 0, 4;
80   my $month = substr $sqldatetime, 5, 2;
81   my $day   = substr $sqldatetime, 8, 2;
82   my $time  = FormatTime (substr $sqldatetime, 11);
83
84   return $months {$month} . " $day, $year \@ $time";
85 } # SQLDatetime2UnixDatetime
86
87 sub SubtractDays {
88   my $timestamp   = shift;
89   my $nbr_of_days = shift;
90
91   my @months = (
92     31, # January
93     28, # February
94     31, # March
95     30, # April
96     31, # May
97     30, # June
98     31, # July
99     31, # August
100     30, # September
101     31, # October
102     30, # November
103     31  # Descember
104   );
105
106   my $year  = substr $timestamp, 0, 4;
107   my $month = substr $timestamp, 5, 2;
108   my $day   = substr $timestamp, 8, 2;
109
110   # Convert to Julian
111   my $days = 0;
112   my $m    = 1;
113
114   foreach (@months) {
115     last if $m >= $month;
116     $m++;
117     $days += $_;
118   } # foreach
119
120   # Subtract $nbr_of_days
121   $days += $day - $nbr_of_days;
122
123   # Compute $days_in_year
124   my $days_in_year;
125
126   # Adjust if crossing year boundary
127   if ($days <= 0) {
128     $year--;
129     $days_in_year = (($year % 4) eq 0) ? 366 : 365;
130     $days = $days_in_year + $days;
131   } else {
132     $days_in_year = (($year % 4) eq 0) ? 366 : 365;
133   } # if
134
135   # Convert back
136   $month = 0;
137
138   while ($days > 28) {
139     # If remaining days is less than the current month then last
140     last if ($days <= $months[$month]);
141
142     # Subtract off the number of days in this month
143     $days -= $months[$month++];
144   } # while
145
146   # Prefix month with 0 if necessary
147   $month++;
148   if ($month < 10) {
149     $month = "0" . $month;
150   } # if
151
152   # Prefix days with  0 if necessary
153   if ($days eq 0) { 
154       $days = "01";
155   } elsif ($days < 10) {
156     $days = "0" . $days;
157   } # if  
158
159   return $year . "-" . $month . "-" . $days . substr $timestamp, 10;
160 } # SubtractDays
161
162 sub Today2SQLDatetime {
163   return UnixDatetime2SQLDatetime (scalar (localtime));
164 } # Today2SQLDatetime
165
166 sub UnixDatetime2SQLDatetime {
167   my $datetime = shift;
168
169   my $orig_datetime = $datetime;
170   my %months = (
171     "Jan" => "01",
172     "Feb" => "02",
173     "Mar" => "03",
174     "Apr" => "04",
175     "May" => "05",
176     "Jun" => "06",
177     "Jul" => "07",
178     "Aug" => "08",
179     "Sep" => "09",
180     "Oct" => "10",
181     "Nov" => "11",
182     "Dec" => "12"
183   );
184
185   # Some mailers neglect to put the leading day of the week field in.
186   # Check for this and compensate.
187   my $dow = substr $datetime, 0, 3;
188
189   if ($dow ne "Mon" &&
190       $dow ne "Tue" &&
191       $dow ne "Wed" &&
192       $dow ne "Thu" &&
193       $dow ne "Fri" &&
194       $dow ne "Sat" &&
195       $dow ne "Sun") {
196     $datetime = "XXX, " . $datetime;
197   } # if
198
199   # Some mailers have day before month. We need to correct this
200   my $day = substr $datetime, 5, 2;
201
202   if ($day =~ /\d /) {
203     $day = "0" . (substr $day, 0, 1);
204     $datetime = (substr $datetime, 0, 5) . $day . (substr $datetime, 6);
205   } # if
206
207   if ($day !~ /\d\d/) {
208     $day = substr $datetime, 8, 2;
209   } # if
210
211   # Check for 1 digit date
212   if ((substr $day, 0, 1) eq " ") {
213     $day = "0" . (substr $day, 1, 1);
214     $datetime = (substr $datetime, 0, 8) . $day . (substr $datetime, 10);
215   } # if
216
217   my $year  = substr $datetime, 20, 4;
218
219   if ($year !~ /\d\d\d\d/) {
220     $year = substr $datetime, 12, 4;
221     if ($year !~ /\d\d\d\d/) {
222       $year = substr $datetime, 12, 2;
223     } #if
224   } # if
225
226   # Check for 2 digit year. Argh!
227   if (length $year == 2 or (substr $year, 2, 1) eq " ") {
228       $year = "20" . (substr $year, 0, 2);
229       $datetime = (substr $datetime, 0, 12) . "20" . (substr $datetime, 12);
230   } # if
231
232   my $month_name = substr $datetime, 4, 3;
233
234   if (!defined $months {$month_name}) {
235     $month_name = substr $datetime, 8, 3;
236   } # if
237   my $month = $months {$month_name};
238
239   my $time  = substr $datetime, 11, 8;
240
241   if ($time !~ /\d\d:\d\d:\d\d/) {
242     $time = substr $datetime, 17, 8
243   } # if
244
245   if (!defined $year) {
246     print "WARNING: Year undefined for $orig_datetime\nReturning today's date\n";
247     return Today2SQLDatetime;
248   } # if
249   if (!defined $month) {
250     print "Month undefined for $orig_datetime\nReturning today's date\n";
251     return Today2SQLDatetime;
252   } # if
253   if (!defined $day) {
254     print "Day undefined for $orig_datetime\nReturning today's date\n";
255     return Today2SQLDatetime;
256   } # if
257   if (!defined $time) {
258     print "Time undefined for $orig_datetime\nReturning today's date\n";
259     return Today2SQLDatetime;
260   } # if
261
262   return "$year-$month-$day $time";
263 } # UnixDatetime2SQLDatetime
264
265 1;