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