MayaChemTools

   1 package TimeUtil;
   2 #
   3 # $RCSfile: TimeUtil.pm,v $
   4 # $Date: 2015/02/28 20:47:30 $
   5 # $Revision: 1.9 $
   6 #
   7 # Author: Manish Sud <msud@san.rr.com>
   8 #
   9 # Copyright (C) 2015 Manish Sud. All rights reserved.
  10 #
  11 # This file is part of MayaChemTools.
  12 #
  13 # MayaChemTools is free software; you can redistribute it and/or modify it under
  14 # the terms of the GNU Lesser General Public License as published by the Free
  15 # Software Foundation; either version 3 of the License, or (at your option) any
  16 # later version.
  17 #
  18 # MayaChemTools is distributed in the hope that it will be useful, but without
  19 # any warranty; without even the implied warranty of merchantability of fitness
  20 # for a particular purpose.  See the GNU Lesser General Public License for more
  21 # details.
  22 #
  23 # You should have received a copy of the GNU Lesser General Public License
  24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
  25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
  26 # Boston, MA, 02111-1307, USA.
  27 #
  28 
  29 use strict;
  30 use Exporter;
  31 use Time::localtime ();
  32 
  33 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  34 
  35 @ISA = qw(Exporter);
  36 @EXPORT = qw(CTimeStamp FPFileTimeStamp ISO8601Date ISO8601Time ISO8601TimeStamp PDBFileTimeStamp SDFileTimeStamp TimeStamp MonthNameToNumber MonthNumberToFullName MonthNumberToAbbreviatedName WeekDayNameToNumber WeekDayNumberToFullName WeekDayNumberToAbbreviatedName);
  37 @EXPORT_OK = qw();
  38 %EXPORT_TAGS = (all  => [@EXPORT, @EXPORT_OK]);
  39 
  40 #
  41 # Initialize package data...
  42 #
  43 my(%MonthNameToNumber, %MonthNumberToFullNameName, %MonthNumberToAbbreviatedName, %WeekDayNameToNumber, %WeekDayNumberToFullName, %WeekDayNumberToAbbreviatedName);
  44 _InitializeData();
  45 
  46 # Return CTime as default time stamp for MayaChemTools...
  47 #
  48 sub TimeStamp {
  49   return CTimeStamp();
  50 }
  51 
  52 # Generate ctime time stamp...
  53 #
  54 # Format: WDay Mon MDay HH:MM:SS YYYY
  55 #
  56 sub CTimeStamp {
  57   my($CTimeStamp);
  58 
  59   # Take out an extra space inserted between month name and day by ctime...
  60   $CTimeStamp = Time::localtime::ctime();
  61   $CTimeStamp =~ s/[ ]+/ /g;
  62 
  63   return $CTimeStamp;
  64 }
  65 
  66 # Generate ISO 8601 timestamp in extended format...
  67 #
  68 # Format: [YYYY]-[MM]-[DD]T[hh]:[mm]:[ss]
  69 #
  70 sub ISO8601TimeStamp {
  71   my($TimeStamp, $Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst);
  72 
  73   ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst) = _LocalTime();
  74 
  75   $TimeStamp = sprintf "%4i-%02i-%02iT%02i:%02i:%02i", $Year, $Mon, $MDay, $Hour, $Min, $Sec;
  76 
  77   return $TimeStamp;
  78 }
  79 
  80 # Generate ISO 8601 date...
  81 #
  82 # Format: [YYYY]-[MM]-[DD]
  83 #
  84 sub ISO8601Date {
  85   my($Date, $Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst);
  86 
  87   ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst) = _LocalTime();
  88 
  89   $Date = sprintf "%4i-%02i-%02i", $Year, $Mon, $MDay;
  90 
  91   return $Date;
  92 }
  93 
  94 # Generate ISO 8601 time in extended format...
  95 #
  96 # Format: [hh]:[mm]:[ss]
  97 #
  98 sub ISO8601Time {
  99   my($Time, $Sec, $Min, $Hour);
 100 
 101   ($Sec, $Min, $Hour) = _LocalTime();
 102 
 103   $Time = sprintf "%02i:%02i:%02i", $Hour, $Min, $Sec;
 104 
 105   return $Time;
 106 }
 107 
 108 # Generate MayaChemTools' FP file timestamp...
 109 #
 110 sub FPFileTimeStamp {
 111   return CTimeStamp();
 112 }
 113 
 114 # Generate PDB file timestamp...
 115 #
 116 sub PDBFileTimeStamp {
 117   my($TimeStamp, $Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst, $MonthName);
 118 
 119   ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst) = _LocalTime();
 120 
 121   $MonthName = uc MonthNumberToAbbreviatedName($Mon);
 122   $Year = substr($Year, -2, 2);
 123 
 124   $TimeStamp = sprintf "%02i-%3s-%2i", $MDay, $MonthName, $Year;
 125 
 126   return $TimeStamp;
 127 }
 128 
 129 # Generate SD file timestamp...
 130 #
 131 sub SDFileTimeStamp {
 132   my($TimeStamp, $Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst);
 133 
 134   ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst) = _LocalTime();
 135 
 136   $Year = substr($Year, -2, 2);
 137 
 138   $TimeStamp = sprintf "%02i%02i%02i%02i%02i", $Mon, $MDay, $Year, $Hour, $Min;
 139 
 140   return $TimeStamp;
 141 }
 142 
 143 # Get local time with modifications to data returned by native localtime function...
 144 #
 145 sub _LocalTime {
 146   my($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst);
 147 
 148   ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst) = localtime;
 149 
 150   $Mon += 1;
 151   $Year += 1900;
 152 
 153   return ($Sec, $Min, $Hour, $MDay, $Mon, $Year, $WDay, $YDay, $IsDst);
 154 }
 155 
 156 # Return month number from full or three letter abbreviated month name...
 157 sub MonthNameToNumber {
 158   my($Name) = @_;
 159 
 160   return (exists $MonthNameToNumber{lc $Name}) ? $MonthNameToNumber{lc $Name} : '';
 161 }
 162 
 163 # Return full month name from month number...
 164 sub MonthNumberToFullName {
 165   my($Number) = @_;
 166 
 167   return (exists $MonthNumberToFullNameName{$Number}) ? $MonthNumberToFullNameName{$Number} : '';
 168 }
 169 
 170 # Return three letter abbreviated month name from month number...
 171 sub MonthNumberToAbbreviatedName {
 172   my($Number) = @_;
 173 
 174   return (exists $MonthNumberToAbbreviatedName{$Number}) ? $MonthNumberToAbbreviatedName{$Number} : '';
 175 }
 176 
 177 # Return week daty number from full or three letter abbreviated week day name...
 178 sub WeekDayNameToNumber {
 179   my($Name) = @_;
 180 
 181   return (exists $WeekDayNameToNumber{lc $Name}) ? $WeekDayNameToNumber{lc $Name} : '';
 182 }
 183 
 184 # Return full week day name from week day number...
 185 sub WeekDayNumberToFullName {
 186   my($Number) = @_;
 187 
 188   return (exists $WeekDayNumberToFullName{$Number}) ? $WeekDayNumberToFullName{$Number} : '';
 189 }
 190 
 191 # Return three letter abbreviated week day name from week day number...
 192 sub WeekDayNumberToAbbreviatedName {
 193   my($Number) = @_;
 194 
 195   return (exists $WeekDayNumberToAbbreviatedName{$Number}) ? $WeekDayNumberToAbbreviatedName{$Number} : '';
 196 }
 197 
 198 # Initialize week/month day/name data...
 199 #
 200 sub _InitializeData {
 201 
 202   %MonthNameToNumber = ('january' => 1, 'february' => 2, 'march' => 3, 'april' => 4,
 203                         'may' => 5, 'june' => 6, 'july' => 7, 'august' => 8,
 204                         'september' => 9, 'october' => 10, 'november' => 11, 'december' => 12,
 205                         'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
 206                         'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8,
 207                         'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12);
 208 
 209   %MonthNumberToFullNameName = (1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April',
 210                                 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August',
 211                                 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December');
 212 
 213   %MonthNumberToAbbreviatedName = (1 => 'Jan', 2 => 'Feb', 3 => 'Mar', 4 => 'Apr',
 214                                    5 => 'May', 6 => 'Jun', 7 => 'Jul', 8 => 'Aug',
 215                                    9 => 'Sep', 10 => 'Oct', 11 => 'Nov', 12 => 'Dec');
 216 
 217   %WeekDayNameToNumber = ('sunday' => 1, 'monday' => 2, 'tuesday' => 3, 'wednesday' => 4,
 218                           'thursday' => 5, 'friday' => 6, 'saturday' => 7,
 219                           'sun' => 1, 'mon' => 2, 'tue' => 3, 'wed' => 4,
 220                           'thu' => 5, 'fri' => 6, 'sat' => 7);
 221 
 222   %WeekDayNumberToFullName = (1 => 'Sunday', 2 => 'Monday', 3 => 'Tuesday',
 223                               4 => 'Wednesday', 5 => 'Thursday', 6 => 'Friday', 7 => 'Saturday');
 224 
 225   %WeekDayNumberToAbbreviatedName = (1 => 'Sun', 2 => 'Mon', 3 => 'Tue',
 226                                      4 => 'Wed', 5 => 'Thu', 6 => 'Fri', 7 => 'Sat');
 227 }
 228