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