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