# Functions to help work with dates and time _convertToUnixTimestamp_() { # DESC: # Convert date string to unix timestamp # ARGS: # $1 (Required) - Date to be converted # OUTS: # 0 If successful # 1 If failed to convert # stdout: timestamp for specified date/time # USAGE: # printf "%s\n" "$(_convertToUnixTimestamp_ "Jan 10, 2019")" # NOTES: # [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _date _date=$(date -d "${1}" +"%s") || return 1 printf "%s\n" "${_date}" } _countdown_() { # DESC: # Sleep for a specified amount of time # ARGS: # $1 (Optional) - Total seconds to sleep for(Default is 10) # $2 (Optional) - Increment to count down # $3 (Optional) - Message to print at each increment (default is ...) # OUTS: # stdout: Prints the message at each increment # USAGE: # _countdown_ 10 1 "Waiting for cache to invalidate" local i ii t local _n=${1:-10} local _sleepTime=${2:-1} local _message="${3:-...}" ((t = _n + 1)) for ((i = 1; i <= _n; i++)); do ((ii = t - i)) if declare -f "info" &>/dev/null 2>&1; then info "${_message} ${ii}" else echo "${_message} ${ii}" fi sleep "${_sleepTime}" done } _dateUnixTimestamp_() { # DESC: # Get the current time in unix timestamp # ARGS: # None # OUTS: # stdout: Prints result ~ 1591554426 # 0 If successful # 1 If failed to get timestamp # USAGE: # _dateUnixTimestamp_ local _now _now="$(date --universal +%s)" || return 1 printf "%s\n" "${_now}" } _formatDate_() { # DESC: # Reformats dates into user specified formats # ARGS: # $1 (Required) - Date to be formatted # $2 (Optional) - Format in any format accepted by bash's date command. # Examples: # %F - YYYY-MM-DD # %D - MM/DD/YY # %a - Name of weekday in short (like Sun, Mon, Tue, Wed, Thu, Fri, Sat) # %A - Name of weekday in full (like Sunday, Monday, Tuesday) # '+%m %d, %Y' - 12 27, 2019 # OUTS: # stdout: Prints result # USAGE: # _formatDate_ "Jan 10, 2019" "%D" # NOTE: # Defaults to YYYY-MM-DD or $(date +%F) [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _d="${1}" local _format="${2:-%F}" _format="${_format//+/}" date -d "${_d}" "+${_format}" } _fromSeconds_() { # DESC: # Convert seconds to HH:MM:SS # ARGS: # $1 (Required) - Time in seconds # OUTS: # stdout: HH:MM:SS # USAGE: # _fromSeconds_ "SECONDS" # EXAMPLE: # To compute the time it takes a script to run: # STARTTIME=$(date +"%s") # ENDTIME=$(date +"%s") # TOTALTIME=$(($ENDTIME-$STARTTIME)) # human readable time # _fromSeconds_ "$TOTALTIME" [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _h local _m local _s ((_h = ${1} / 3600)) ((_m = (${1} % 3600) / 60)) ((_s = ${1} % 60)) printf "%02d:%02d:%02d\n" "${_h}" "${_m}" "${_s}" } _monthToNumber_() { # DESC: # Convert a month name to a number # ARGS: # $1 (Required) - Month name # OUTS: # stdout: Prints the number of the month (1-12) # USAGE: # _monthToNumber_ "January" [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _mon _mon="$(echo "$1" | tr '[:upper:]' '[:lower:]')" case "${_mon}" in january | jan | ja) echo 1 ;; february | feb | fe) echo 2 ;; march | mar | ma) echo 3 ;; april | apr | ap) echo 4 ;; may) echo 5 ;; june | jun | ju) echo 6 ;; july | jul) echo 7 ;; august | aug | au) echo 8 ;; september | sep | se) echo 9 ;; october | oct | oc) echo 10 ;; november | nov | no) echo 11 ;; december | dec | de) echo 12 ;; *) warning "_monthToNumber_: Bad month name: ${_mon}" return 1 ;; esac } _numberToMonth_() { # DESC: # Convert a month number to its name # ARGS: # $1 (Required) - Month number (1-12) # OUTS: # stdout: Prints the name of the month # USAGE: # _numberToMonth_ 11 [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _mon="$1" case "${_mon}" in 1 | 01) echo January ;; 2 | 02) echo February ;; 3 | 03) echo March ;; 4 | 04) echo April ;; 5 | 05) echo May ;; 6 | 06) echo June ;; 7 | 07) echo July ;; 8 | 08) echo August ;; 9 | 09) echo September ;; 10) echo October ;; 11) echo November ;; 12) echo December ;; *) warning "_numberToMonth_: Bad month number: ${_mon}" return 1 ;; esac } _parseDate_() { # DESC: # Takes a string as input and attempts to find a date within it to parse # into component parts (day, month, year) # ARGS: # $1 (required) - A string # OUTS: # 0 if date is found # 1 if date is NOT found # If a date was found, the following variables are set: # $PARSE_DATE_FOUND - The date found in the string # $PARSE_DATE_YEAR - The year # $PARSE_DATE_MONTH - The number month # $PARSE_DATE_MONTH_NAME - The name of the month # $PARSE_DATE_DAY - The day # $PARSE_DATE_HOUR - The hour (if avail) # $PARSE_DATE_MINUTE - The minute (if avail) # USAGE: # if _parseDate_ "[STRING]"; then ... # NOTE: # - This function only recognizes dates from the year 2000 to 202 # - Will recognize dates in the following formats separated by '-_ ./' # * YYYY-MM-DD * Month DD, YYYY * DD Month, YYYY # * Month, YYYY * Month, DD YY * MM-DD-YYYY # * MMDDYYYY * YYYYMMDD * DDMMYYYY # * YYYYMMDDHHMM * YYYYMMDDHH * DD-MM-YYYY # * DD MM YY * MM DD YY # TODO: Impelemt the following date formats # * MMDDYY * YYMMDD * mon-DD-YY # TODO: Simplify and reduce the number of regex checks [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _stringToTest="${1}" local _pat PARSE_DATE_FOUND="" PARSE_DATE_YEAR="" PARSE_DATE_MONTH="" PARSE_DATE_MONTH_NAME="" PARSE_DATE_DAY="" PARSE_DATE_HOUR="" PARSE_DATE_MINUTE="" #shellcheck disable=SC2064 trap '$(shopt -p nocasematch)' RETURN # reset nocasematch when function exits shopt -s nocasematch # Use case-insensitive regex debug "_parseDate_() input: ${_stringToTest}" # YYYY MM DD or YYYY-MM-DD _pat="(.*[^0-9]|^)((20[0-2][0-9])[-\.\/_ ]+([0-9]{1,2})[-\.\/_ ]+([0-9]{1,2}))([^0-9].*|$)" if [[ ${_stringToTest} =~ ${_pat} ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR=$((10#${BASH_REMATCH[3]})) PARSE_DATE_MONTH=$((10#${BASH_REMATCH[4]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[5]})) debug "regex match: YYYY-MM-DD " # Month DD, YYYY elif [[ ${_stringToTest} =~ ((january|jan|ja|february|feb|fe|march|mar|ma|april|apr|ap|may|june|jun|july|jul|ju|august|aug|september|sep|october|oct|november|nov|december|dec)[-\./_ ]+([0-9]{1,2})(nd|rd|th|st)?,?[-\./_ ]+(20[0-2][0-9]))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[1]:-}" PARSE_DATE_MONTH=$(_monthToNumber_ "${BASH_REMATCH[2]:-}") PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH:-}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[3]:-})) PARSE_DATE_YEAR=$((10#${BASH_REMATCH[5]:-})) debug "regex match: Month DD, YYYY" # Month DD, YY elif [[ ${_stringToTest} =~ ((january|jan|ja|february|feb|fe|march|mar|ma|april|apr|ap|may|june|jun|july|jul|ju|august|aug|september|sep|october|oct|november|nov|december|dec)[-\./_ ]+([0-9]{1,2})(nd|rd|th|st)?,?[-\./_ ]+([0-9]{2}))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[1]}" PARSE_DATE_MONTH=$(_monthToNumber_ "${BASH_REMATCH[2]}") PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[3]})) PARSE_DATE_YEAR="20$((10#${BASH_REMATCH[5]}))" debug "regex match: Month DD, YY" # DD Month YYYY elif [[ ${_stringToTest} =~ (.*[^0-9]|^)(([0-9]{2})[-\./_ ]+(january|jan|ja|february|feb|fe|march|mar|ma|april|apr|ap|may|june|jun|july|jul|ju|august|aug|september|sep|october|oct|november|nov|december|dec),?[-\./_ ]+(20[0-2][0-9]))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY=$((10#"${BASH_REMATCH[3]}")) PARSE_DATE_MONTH="$(_monthToNumber_ "${BASH_REMATCH[4]}")" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR=$((10#"${BASH_REMATCH[5]}")) debug "regex match: DD Month, YYYY" # MM-DD-YYYY or DD-MM-YYYY elif [[ ${_stringToTest} =~ (.*[^0-9]|^)(([0-9]{1,2})[-\.\/_ ]+([0-9]{1,2})[-\.\/_ ]+(20[0-2][0-9]))([^0-9].*|$) ]]; then if [[ $((10#${BASH_REMATCH[3]})) -lt 13 && $((10#${BASH_REMATCH[4]})) -gt 12 && $((10#${BASH_REMATCH[4]})) -lt 32 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR=$((10#${BASH_REMATCH[5]})) PARSE_DATE_MONTH=$((10#${BASH_REMATCH[3]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[4]})) debug "regex match: MM-DD-YYYY" elif [[ $((10#${BASH_REMATCH[3]})) -gt 12 && $((10#${BASH_REMATCH[3]})) -lt 32 && $((10#${BASH_REMATCH[4]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR=$((10#${BASH_REMATCH[5]})) PARSE_DATE_MONTH=$((10#${BASH_REMATCH[4]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[3]})) debug "regex match: DD-MM-YYYY" elif [[ $((10#${BASH_REMATCH[3]})) -lt 32 && $((10#${BASH_REMATCH[4]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR=$((10#${BASH_REMATCH[5]})) PARSE_DATE_MONTH=$((10#${BASH_REMATCH[3]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[4]})) debug "regex match: MM-DD-YYYY" else shopt -u nocasematch return 1 fi elif [[ ${_stringToTest} =~ (.*[^0-9]|^)(([0-9]{1,2})[-\.\/_ ]+([0-9]{1,2})[-\.\/_ ]+([0-9]{2}))([^0-9].*|$) ]]; then if [[ $((10#${BASH_REMATCH[3]})) -lt 13 && $((10#${BASH_REMATCH[4]})) -gt 12 && $((10#${BASH_REMATCH[4]})) -lt 32 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR="20$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH=$((10#${BASH_REMATCH[3]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[4]})) debug "regex match: MM-DD-YYYY" elif [[ $((10#${BASH_REMATCH[3]})) -gt 12 && $((10#${BASH_REMATCH[3]})) -lt 32 && $((10#${BASH_REMATCH[4]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR="20$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH=$((10#${BASH_REMATCH[4]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[3]})) debug "regex match: DD-MM-YYYY" elif [[ $((10#${BASH_REMATCH[3]})) -lt 32 && $((10#${BASH_REMATCH[4]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_YEAR="20$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH=$((10#${BASH_REMATCH[3]})) PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_DAY=$((10#${BASH_REMATCH[4]})) debug "regex match: MM-DD-YYYY" else shopt -u nocasematch return 1 fi # Month, YYYY elif [[ ${_stringToTest} =~ ((january|jan|ja|february|feb|fe|march|mar|ma|april|apr|ap|may|june|jun|july|jul|ju|august|aug|september|sep|october|oct|november|nov|december|dec),?[-\./_ ]+(20[0-2][0-9]))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[1]}" PARSE_DATE_DAY="1" PARSE_DATE_MONTH="$(_monthToNumber_ "${BASH_REMATCH[2]}")" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="$((10#${BASH_REMATCH[3]}))" debug "regex match: Month, YYYY" # YYYYMMDDHHMM elif [[ ${_stringToTest} =~ (.*[^0-9]|^)((20[0-2][0-9])([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2}))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[4]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="$((10#${BASH_REMATCH[3]}))" PARSE_DATE_HOUR="$((10#${BASH_REMATCH[6]}))" PARSE_DATE_MINUTE="$((10#${BASH_REMATCH[7]}))" debug "regex match: YYYYMMDDHHMM" # YYYYMMDDHH 1 2 3 4 5 6 elif [[ ${_stringToTest} =~ (.*[^0-9]|^)((20[0-2][0-9])([0-9]{2})([0-9]{2})([0-9]{2}))([^0-9].*|$) ]]; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[4]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="$((10#${BASH_REMATCH[3]}))" PARSE_DATE_HOUR="${BASH_REMATCH[6]}" PARSE_DATE_MINUTE="00" debug "regex match: YYYYMMDDHHMM" # MMDDYYYY or YYYYMMDD or DDMMYYYY # 1 2 3 4 5 6 elif [[ ${_stringToTest} =~ (.*[^0-9]|^)(([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2}))([^0-9].*|$) ]]; then # MMDDYYYY if [[ $((10#${BASH_REMATCH[5]})) -eq 20 && $((10#${BASH_REMATCH[3]})) -lt 13 && $((10#${BASH_REMATCH[4]})) -lt 32 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[4]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[3]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="${BASH_REMATCH[5]}${BASH_REMATCH[6]}" debug "regex match: MMDDYYYY" # DDMMYYYY elif [[ $((10#${BASH_REMATCH[5]})) -eq 20 && $((10#${BASH_REMATCH[3]})) -gt 12 && $((10#${BASH_REMATCH[3]})) -lt 32 && $((10#${BASH_REMATCH[4]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[3]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[4]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="${BASH_REMATCH[5]}${BASH_REMATCH[6]}" debug "regex match: DDMMYYYY" # YYYYMMDD elif [[ $((10#${BASH_REMATCH[3]})) -eq 20 && $((10#${BASH_REMATCH[6]})) -gt 12 && $((10#${BASH_REMATCH[6]})) -lt 32 && $((10#${BASH_REMATCH[5]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[6]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="${BASH_REMATCH[3]}${BASH_REMATCH[4]}" debug "regex match: YYYYMMDD" # YYYYDDMM elif [[ $((10#${BASH_REMATCH[3]})) -eq 20 && $((10#${BASH_REMATCH[5]})) -gt 12 && $((10#${BASH_REMATCH[5]})) -lt 32 && $((10#${BASH_REMATCH[6]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[6]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="${BASH_REMATCH[3]}${BASH_REMATCH[4]}" debug "regex match: YYYYMMDD" # Assume YYYMMDD elif [[ $((10#${BASH_REMATCH[3]})) -eq 20 && $((10#${BASH_REMATCH[6]})) -lt 32 && $((10#${BASH_REMATCH[5]})) -lt 13 ]] \ ; then PARSE_DATE_FOUND="${BASH_REMATCH[2]}" PARSE_DATE_DAY="$((10#${BASH_REMATCH[6]}))" PARSE_DATE_MONTH="$((10#${BASH_REMATCH[5]}))" PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" PARSE_DATE_YEAR="${BASH_REMATCH[3]}${BASH_REMATCH[4]}" debug "regex match: YYYYMMDD" else shopt -u nocasematch return 1 fi # # MMDD or DDYY # elif [[ "${_stringToTest}" =~ .*(([0-9]{2})([0-9]{2})).* ]]; then # debug "regex match: MMDD or DDMM" # PARSE_DATE_FOUND="${BASH_REMATCH[1]}" # # Figure out if days are months or vice versa # if [[ $(( 10#${BASH_REMATCH[2]} )) -gt 12 \ # && $(( 10#${BASH_REMATCH[2]} )) -lt 32 \ # && $(( 10#${BASH_REMATCH[3]} )) -lt 13 \ # ]]; then # PARSE_DATE_DAY="$(( 10#${BASH_REMATCH[2]} ))" # PARSE_DATE_MONTH="$(( 10#${BASH_REMATCH[3]} ))" # PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" # PARSE_DATE_YEAR="$(date +%Y )" # elif [[ $(( 10#${BASH_REMATCH[2]} )) -lt 13 \ # && $(( 10#${BASH_REMATCH[3]} )) -lt 32 \ # ]]; then # PARSE_DATE_DAY="$(( 10#${BASH_REMATCH[3]} ))" # PARSE_DATE_MONTH="$(( 10#${BASH_REMATCH[2]} ))" # PARSE_DATE_MONTH_NAME="$(_numberToMonth_ "${PARSE_DATE_MONTH}")" # PARSE_DATE_YEAR="$(date +%Y )" # else # shopt -u nocasematch # return 1 # fi else shopt -u nocasematch return 1 fi [[ -z ${PARSE_DATE_YEAR:-} ]] && { shopt -u nocasematch return 1 } ((PARSE_DATE_MONTH >= 1 && PARSE_DATE_MONTH <= 12)) || { shopt -u nocasematch return 1 } ((PARSE_DATE_DAY >= 1 && PARSE_DATE_DAY <= 31)) || { shopt -u nocasematch return 1 } debug "\$PARSE_DATE_FOUND: ${PARSE_DATE_FOUND}" debug "\$PARSE_DATE_YEAR: ${PARSE_DATE_YEAR}" debug "\$PARSE_DATE_MONTH: ${PARSE_DATE_MONTH}" debug "\$PARSE_DATE_MONTH_NAME: ${PARSE_DATE_MONTH_NAME}" debug "\$PARSE_DATE_DAY: ${PARSE_DATE_DAY}" [[ -z ${PARSE_DATE_HOUR:-} ]] || debug "\$PARSE_DATE_HOUR: ${PARSE_DATE_HOUR}" [[ -z ${PARSE_DATE_MINUTE:-} ]] || debug "\$PARSE_DATE_MINUTE: ${PARSE_DATE_MINUTE}" shopt -u nocasematch } _readableUnixTimestamp_() { # DESC: # Format unix timestamp to human readable format. If format string is not specified then # default to "yyyy-mm-dd hh:mm:ss" # ARGS: # $1 (Required) - Unix timestamp to be formatted # $2 (Optional) - Format string # OUTS: # 0 If successful # 1 If failed to convert # stdout: Human readable format of unix timestamp # USAGE: # _readableUnixTimestamp_ "1591554426" # _readableUnixTimestamp_ "1591554426" "%Y-%m-%d" # CREDIT: # https://github.com/labbots/bash-utility/blob/master/src/date.sh [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _timestamp="${1}" local _format="${2:-"%F %T"}" local _out _out="$(date -d "@${_timestamp}" +"${_format}")" || return 1 printf "%s\n" "${_out}" } _toSeconds_() { # DESC: # Converts HH:MM:SS to seconds # ARGS: # $1 (Required) - Time in HH:MM:SS # OUTS: # stdout: Print seconds # USAGE: # _toSeconds_ "01:00:00" # NOTE: # Acceptable Input Formats # 24 12 09 # 12,12,09 # 12;12;09 # 12:12:09 # 12-12-09 # 12H12M09S # 12h12m09s [[ $# == 0 ]] && fatal "Missing required argument to ${FUNCNAME[0]}" local _saveIFS local _h local _m local _s if [[ $1 =~ [0-9]{1,2}(:|,|-|_|,| |[hHmMsS])[0-9]{1,2}(:|,|-|_|,| |[hHmMsS])[0-9]{1,2} ]]; then _saveIFS="${IFS}" IFS=":,;-_, HhMmSs" read -r _h _m _s <<<"$1" IFS="${_saveIFS}" else _h="$1" _m="$2" _s="$3" fi printf "%s\n" "$((10#${_h} * 3600 + 10#${_m} * 60 + 10#${_s}))" }