#!/bin/bash # Description: This script outputs days until the next time zone # discontinuity using 'zdump' and 'date'. #=================ADJUST ME======================= SCRIPT_TZ="America/Los_Angeles" # Timezone to check for discontinuities #================================================= yell() { echo "$0: $*" >&2; } # Yell, Die, Try Three-Fingered Claw technique; # Ref/Attrib: https://stackoverflow.com/a/25515370 die() { yell "$*"; exit 111; } try() { "$@" || die "cannot $*"; } # Declare variables declare -a datesDiscontArray #array SCRIPT_YEAR=$(date +%Y) SCRIPT_YEAR_NEXT=$(( $(date +%Y) + 1)) SCRIPT_YEAR_NEXT2=$(( $(date +%Y) + 2)) SCRIPT_RUN_DATE_SECONDS=$(date +%s) # Save zdump output for SCRIPT_YEAR (for how multiline data saved in variable, see https://stackoverflow.com/a/613580 ) datesDiscont="$(zdump -c "$SCRIPT_YEAR","$SCRIPT_YEAR_NEXT2" -v $SCRIPT_TZ | grep "$SCRIPT_YEAR\|$SCRIPT_YEAR_NEXT" | awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)" if [ -z "$datesDiscont" ]; then echo "No time discontinuity this year."; exit 1; fi; ###yell "DEBUG:datesDiscont----------"; ###echo "$datesDiscont" 1>&2; ###yell "DEBUG:-----------"; # Count lines in datesDiscont (for counting lines in a variable, see https://stackoverflow.com/a/6314682 ) #datesDiscontLineCount=$(echo "$datesDiscont" | wc -l) # Convert datesDiscont into array (for how to process each line in a multiline variable, see https://superuser.com/a/284226 ) while IFS= read -r line; do #echo "$line" #datesDiscontArray+="$line" datesDiscontArray+=($(date --date="$line" +%s)) #echo ${datesDiscontArray[-1]} done <<< "$datesDiscont" #yell ${datesDiscontArray[@]} # Sort datesDiscontArray (see https://stackoverflow.com/a/11789688 ) IFS=$'\n' datesDiscontArray=($(sort <<<"${datesDiscontArray[*]}")) unset IFS ###yell "DEBUG:"; ###yell "DEBUG:datesDiscontArray:"; ###yell "${datesDiscontArray[@]}"; ###yell "DEBUG:"; # Get earliest date in datesDiscontArray that isn't in the past. for discontinuityDate in "${datesDiscontArray[@]}"; do ###yell "DEBUG:Discontinuity date (seconds):"$discontinuityDate ###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS :"$SCRIPT_RUN_DATE_SECONDS if [ $discontinuityDate -gt $SCRIPT_RUN_DATE_SECONDS ]; then ###yell "DEBUG:Date in future." nextDiscontDate="$discontinuityDate" break fi done # Check that nextDiscontDate is not empty if [ -z "$nextDiscontDate" ]; then echo "ERROR:nextDiscontDate empty" fi; ###yell "DEBUG:nextDiscontDate:$nextDiscontDate"; ###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS:$SCRIPT_RUN_DATE_SECONDS"; echo $(( ( $nextDiscontDate - $SCRIPT_RUN_DATE_SECONDS )/86400 ))" days" # Days until next discontinuity date