MayaChemTools

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