Fixed EOY issue
[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 # Not sure why I was setting TZ to LA but I'm in Phoenix now. This is best
23 # handled by configuring the OS correctly anyway.
24 #BEGIN {
25 #  $ENV{TZ}='America/Los_Angeles';
26 #} # BEGIN
27
28 @ISA = qw (Exporter);
29
30 @EXPORT = qw(
31   CheckEmail
32   FormatDate
33   FormatTime
34   SQLDatetime2UnixDatetime
35   SubtractDays
36   Today2SQLDatetime
37   UnixDatetime2SQLDatetime
38 );
39
40 sub Today2SQLDatetime;
41
42 sub FormatDate($) {
43   my ($date) = @_;
44
45   return substr ($date, 5, 2)  . '/' .
46          substr ($date, 8, 2)  . '/' .
47          substr ($date, 0, 4);
48 } # FormatDate
49
50 sub FormatTime($) {
51   my ($time) = @_;
52
53   my $hours   = substr $time, 0, 2;
54
55   $hours = substr $hours, 1, 1 if $hours < 10;
56
57   my $minutes = substr $time, 3, 2;
58   my $seconds = substr $time, 6, 2;
59   my $AmPm    = $hours > 12 ? 'Pm' : 'Am';
60
61   $hours = $hours - 12 if $hours > 12;
62
63   return "$hours:$minutes:$seconds $AmPm";
64 } # FormatTime
65
66 sub SQLDatetime2UnixDatetime($) {
67   my ($sqldatetime) = @_;
68
69   my %months = (
70     '01' => 'Jan',
71     '02' => 'Feb',
72     '03' => 'Mar',
73     '04' => 'Apr',
74     '05' => 'May',
75     '06' => 'Jun',
76     '07' => 'Jul',
77     '08' => 'Aug',
78     '09' => 'Sep',
79     '10' => 'Oct',
80     '11' => 'Nov',
81     '12' => 'Dec',
82   );
83
84   my $year  = substr $sqldatetime, 0, 4;
85   my $month = substr $sqldatetime, 5, 2;
86   my $day   = substr $sqldatetime, 8, 2;
87   my $time  = FormatTime substr $sqldatetime, 11;
88
89   return $months {$month} . " $day, $year \@ $time";
90 } # SQLDatetime2UnixDatetime
91
92 sub SubtractDays($$) {
93   my ($timestamp,$nbr_of_days) = @_;
94
95   my @months = (
96     31, # January
97     28, # February
98     31, # March
99     30, # April
100     31, # May
101     30, # June
102     31, # July
103     31, # August
104     30, # September
105     31, # October
106     30, # November
107     31  # Descember
108   );
109
110   my $year  = substr $timestamp, 0, 4;
111   my $month = substr $timestamp, 5, 2;
112   my $day   = substr $timestamp, 8, 2;
113
114   # Convert to Julian
115   my $days = 0;
116   my $m    = 1;
117
118   for (@months) {
119     last if $m >= $month;
120     $m++;
121     $days += $_;
122   } # for
123
124   # Subtract $nbr_of_days
125   $days += $day - $nbr_of_days;
126
127   # Compute $days_in_year
128   my $days_in_year = (($year % 4) == 0) ? 366 : 365;
129
130   # Adjust if crossing year boundary
131   if ($days <= 0) {
132     $year--;
133     $days = $days_in_year + $days;
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++ unless $month == 12;
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 sub CheckEmail($$) {
267   my ($username, $domain) = @_;
268
269   # Check to see if a full email address in either $username or $domain
270   if ($username eq '') {
271     return '' if $domain eq '';
272
273     if ($domain =~ /(.*)\@(.*)/) {
274       ($username, $domain) = split '@', $domain;
275     } # if
276   } elsif ($domain eq '') {
277     if ($username =~ /(.*)\@(.*)/) {
278       ($username, $domain) = split '@', $username;
279     } # if
280   } # if
281
282    return lc "$username\@$domain";
283 } # CheckEmail
284
285 1;