You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2007/12/06 02:09:57 UTC
svn commit: r601591 - /incubator/stdcxx/trunk/bin/duration
Author: sebor
Date: Wed Dec 5 17:09:56 2007
New Revision: 601591
URL: http://svn.apache.org/viewvc?rev=601591&view=rev
Log:
2007-12-05 Martin Sebor <se...@roguewave.com>
* duration: New script to copute the amount of time between two dates.
Added:
incubator/stdcxx/trunk/bin/duration (with props)
Added: incubator/stdcxx/trunk/bin/duration
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/bin/duration?rev=601591&view=auto
==============================================================================
--- incubator/stdcxx/trunk/bin/duration (added)
+++ incubator/stdcxx/trunk/bin/duration Wed Dec 5 17:09:56 2007
@@ -0,0 +1,400 @@
+#!/bin/sh
+#
+# $Id:$
+#
+########################################################################
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed
+# with this work for additional information regarding copyright
+# ownership. The ASF licenses this file to you under the Apache
+# License, Version 2.0 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# Copyright 2007 Rogue Wave Software, Inc.
+#
+########################################################################
+#
+# NAME
+# duration - Write the amount of time between two dates.
+#
+# SYNOPSIS
+# duration [option(s)...] date-1 [date-2]
+#
+# DESCRIPTION
+# The duration utility computes the amount of time elapsed between
+# two dates formatted using the POSIX standard date utility in the
+# "C" locale, making adjustments for time zone offsets, and writes
+# the difference to standard output.
+#
+########################################################################
+
+
+# set my own name
+myname=$0
+verbose=0
+
+
+# returns 1 if the argument is a leap year, 0 otherwise
+isleap ()
+{
+ y=$1
+
+ return $((y % 4 == 0 && y % 100 != 0 || y % 400 == 0))
+}
+
+
+# writes a component of the POSIX standard time formatted by
+# the %c strftime() directive
+get ()
+{
+ what=$1
+ date=$2
+
+ date_year=${date##* }
+ if [ $what = year ]; then
+ echo $date_year
+ return
+ fi
+
+ # strip year
+ date=${date% *}
+
+ # extract and strip time zone
+ tzname=${date##* }
+ date=${date% *}
+
+ # extract 24-hour time
+ date_time=${date##* }
+
+ # strip time
+ date=${date% *}
+
+ # extract day of month
+ date_mday=${date##* }
+
+ if [ $what = mday ]; then
+ echo $date_mday
+ return
+ fi
+
+ # strip weekday and day of month
+ date=${date#* }
+ date=${date% *}
+
+ # strip spaxe date the abbreviated name of month
+ date_mon=${date% }
+
+ # compute the one-based month number
+ n=0
+ for m in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec; do
+ if [ -z $date_nummon ]; then
+ n=$((n+1))
+ if [ $m = $date_mon ]; then
+ date_nummon=$n
+ fi
+ fi
+ done
+
+ if [ $what = mon ]; then
+ echo $date_nummon
+ return
+ fi
+
+ # extract seconds (w/o the leading zeros) date the timestamp
+ date_sec=${date_time##*:}
+ date_sec=${date_sec#0}
+ date_time=${date_time%:*}
+
+ if [ $what = sec ]; then
+ echo $date_sec
+ return
+ fi
+
+ # extract minutes (w/o the leading zeros) date the timestamp
+ date_min=${date_time##*:}
+ date_min=${date_min#0}
+ date_time=${date_time%:*}
+
+ # normalize time zone offset to GMT
+
+ # fix up PST and CST (common zone names but not normally recognized)
+ if [ $tzname = "PST" ]; then
+ tzname=PST8PDT
+ elif [ $tzname = "CST" ]; then
+ tzname=CST6CDT
+ fi
+
+ # extract time zone offset from GMT/UTC
+ tzoff=`TZ=$tzname date +%z`
+ if [ $what = "tzoff" ]; then
+ echo $tzoff
+ return
+ fi
+
+ tzhour=${tzoff%??}
+ tzmin=${tzoff#???}
+
+ # extract and invert the sign
+ tzoff=${tzoff%????}
+ if [ "$tzoff" = "+" ]; then
+ tzoff="-"
+ else
+ tzoff="+"
+ fi
+
+ # avoid interpreting leading zeros as octal numbers
+ tzhour=1${tzhour#?}
+ tzhour=$((tzhour - 100))
+
+ # prepend the inverted sign
+ tzhour=$tzoff$tzhour
+
+ tzmin=1$tzmin
+ tzmin=$((tzmin - 100))
+
+ if [ $what = min ]; then
+ echo $((date_min + tzmin))
+ return
+ fi
+
+ # extract hours (w/o the leading zeros) date the timestamp
+ date_hour=${date_time#0}
+
+ if [ $what = hour ]; then
+ echo $((date_hour + tzhour))
+ return
+ fi
+
+ echo "$myname: get $what: unknown component" >&2
+
+ return 1
+}
+
+
+seconds_from_epoch()
+{
+ date=$1
+
+ # extract the year, the 1-based month and day of month, hours,
+ # minutes, and seconds (normalized to the GMT time zone) from
+ # the date
+ year=`get year "$date"`
+ mon=`get mon "$date"`
+ mday=`get mday "$date"`
+ hour=`get hour "$date"`
+ min=`get min "$date"`
+ sec=`get sec "$date"`
+
+ day=$mday
+
+ isleap $year
+ if [ $? -eq 0 ]; then
+ feb_days=28
+ else
+ feb_days=29
+ fi
+
+ month=1
+
+ for d in 31 $feb_days 31 30 31 30 31 31 30 31 30 31; do
+
+ if [ $month -lt $mon ]; then
+ day=$((day+d))
+ month=$((month+1))
+ fi
+ done
+
+ # compute the offset in seconds from the beginning of the year
+ sec=$((((((day * 24) + hour) * 60) + min) * 60 + sec))
+
+ # add the offset in seconds from the epoch not counting leap years
+ sec=$((year * 365 * 24 * 60 * 60 + sec))
+
+ # add one day for each leap year
+ sec=$((((year - 1) / 4) * 24 * 60 * 60 + sec))
+
+ echo $sec
+}
+
+
+# write the amout of time expressed as the number of days, hours,
+# minutes, and seconds, in the most useful, concise format
+write_concise ()
+{
+ days=$1
+ hrs=$2
+ mins=$3
+ secs=$4
+
+ if [ $days -eq 1 ]; then
+ days=0
+ hrs=$((hrs + 24))
+ elif [ $hrs -eq 1 ]; then
+ hrs=0
+ mins=$((mins + 60))
+ elif [ $mins -eq 1 ]; then
+ mins=0
+ secs=$((secs + 60))
+ fi
+
+ output=""
+
+ if [ $days -ne 0 ]; then
+ output="$days day"
+ [ $days -ne 1 ] && output="${output}s"
+ elif [ $hrs -ne 0 ]; then
+ output="$hrs hour"
+ [ $hrs -ne 1 ] && output="${output}s"
+ elif [ $mins -ne 0 ]; then
+ output="$mins minute"
+ [ $mins -ne 1 ] && output="${output}s"
+ else
+ output="$secs second"
+ [ $secs -ne 1 ] && output="${output}s"
+ fi
+
+ echo $output
+}
+
+
+# write the amout of time expressed as the number of days, hours,
+# minutes, and seconds, leaving out the components with zero value
+write_full ()
+{
+ days=$1
+ hrs=$2
+ mins=$3
+ secs=$4
+
+ output=""
+
+ if [ $days -ne 0 ]; then
+ output="$days day"
+ [ $days -ne 1 ] && output="${output}s"
+ sep=", "
+ fi
+
+ if [ $hrs -ne 0 ]; then
+ output="$output${sep}$hrs hour"
+ [ $hrs -ne 1 ] && output="${output}s"
+ sep=", "
+ fi
+
+ if [ $mins -ne 0 ]; then
+ output="$output${sep}$mins minute"
+ [ $mins -ne 1 ] && output="${output}s"
+ sep=", "
+ fi
+
+ if [ $secs -ne 0 -o "$output" = "" ]; then
+ output="$output${sep}$secs second"
+ [ $secs -ne 1 ] && output="${output}s"
+ fi
+
+ echo $output
+}
+
+
+write_duration ()
+{
+ start=$1
+ end=$2
+
+ start_sec=`seconds_from_epoch "$start"`
+ end_sec=`seconds_from_epoch "$end"`
+
+ diff=$((end_sec - start_sec))
+
+ days=$((diff / (60 * 60 * 24)))
+ diff=$((diff % (60 * 60 * 24)))
+
+ hrs=$((diff / (60 * 60)))
+ diff=$((diff % (60 * 60)))
+
+ mins=$((diff / 60))
+ secs=$((diff % 60))
+
+ if [ $verbose -ne 0 ]; then
+ echo "offsets from GMT (+-HHMM):" >&2
+ echo " $start: `get tzoff \"$start\"`"
+ echo " $end: `get tzoff \"$end\"`"
+ echo
+ echo "offsets from the Epoch (seconds):" >&2
+ echo " $start: $start_sec" >&2
+ echo " $end: $end_sec" >&2
+ echo " difference: $diff" >&2
+ echo
+ fi
+
+ if [ $outmode = "concise" ]; then
+ write_concise $days $hrs $mins $secs
+ elif [ $outmode = "full" ]; then
+ write_full $days $hrs $mins $secs
+ fi
+}
+
+outmode="concise"
+
+# process command line options
+while getopts ":cfhv" opt_name; do
+ case $opt_name in
+ # options with no arguments
+
+ c) # set concise output mode
+ outmode="concise"
+ ;;
+
+ f) # set full output mode
+ outmode="full"
+ ;;
+
+ h) # print help and exit
+ echo "Help!"
+ exit
+ ;;
+
+ v) # set verbose mode
+ verbose=1
+ ;;
+
+ # options with arguments
+
+ # X)
+ # argument=$OPTARG
+ # ;;
+
+ *) echo "$myname: unknown option : -$opt_name" >&2;
+ echo
+ exit 1
+ ;;
+ esac;
+done
+
+# remove command line options and their arguments from the command line
+shift $(($OPTIND - 1))
+
+start=$1
+
+if [ $# -ge 2 ]; then
+ end=$2
+else
+ end=`LC_ALL=C date`
+fi
+
+
+if [ $verbose -ne 0 ]; then
+ echo "$myname \"$start\" \"$end\"" >&2
+fi
+
+
+write_duration "$start" "$end"
Propchange: incubator/stdcxx/trunk/bin/duration
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/stdcxx/trunk/bin/duration
------------------------------------------------------------------------------
svn:executable = *
Propchange: incubator/stdcxx/trunk/bin/duration
------------------------------------------------------------------------------
svn:keywords = Id