Skip to content

Instantly share code, notes, and snippets.

@weibeld
Last active December 10, 2015 21:36
Show Gist options
  • Save weibeld/6694b7e9ec49df009595 to your computer and use it in GitHub Desktop.
Save weibeld/6694b7e9ec49df009595 to your computer and use it in GitHub Desktop.
Print a sequence of dates in one-week intervals
#!/bin/bash
#
# Print sequence of dates in one-week intervals, starting from an initial date.
#
# Daniel Weibel <danielmweibel@gmail.com> October 2015
#------------------------------------------------------------------------------#
set -e
help() {
cat <<EOF
weeks: print a sequence of dates in one-week intervals
Usage:
${0##*/} <start> <n>
Arguments:
<start> Start date in format "YYYY-MM-DD"
<n> Number of dates to print
EOF
}
[[ "$1" == --help || "$1" == -h ]] && help && exit
[[ "$#" -ne 2 ]] && help && exit 1
start=$1
n=$2
# Number of seconds in a week
week=$((7*24*60*60))
# Helper functions
is_mac() { [[ "$OSTYPE" =~ darwin ]]; }
is_linux() { [[ "$OSTYPE" =~ linux ]]; }
os_err() { echo "Error: unknown operating system" >&2; exit 1; }
# Convert "YYYY-MM-DD" (assume 12:00:00) to UNIX timestamp (seconds)
date2ts() {
if is_mac; then date -j -f "%Y-%m-%d %H%M%S" "$1 120000" '+%s'
elif is_linux; then date -d "$1 12:00:00" '+%s'
else os_err; fi
}
# Convert UNIX timestamp to date in a specific format
format='+%A, %d %B %Y'
ts2date() {
if is_mac; then date -j -f '%s' "$1" "$format"
elif is_linux; then date -d "@$1" "$format"
else os_err; fi
}
# Do actual work (calculate timestamps of dates to print, and print dates)
ts=$(date2ts "$start")
for i in $(seq 1 "$n"); do
ts2date "$ts"
ts=$(($ts+$week))
done
bash> weeks 2015-12-10 40
Thursday, 10 December 2015
Thursday, 17 December 2015
Thursday, 24 December 2015
Thursday, 31 December 2015
Thursday, 07 January 2016
Thursday, 14 January 2016
Thursday, 21 January 2016
Thursday, 28 January 2016
Thursday, 04 February 2016
Thursday, 11 February 2016
Thursday, 18 February 2016
Thursday, 25 February 2016
Thursday, 03 March 2016
Thursday, 10 March 2016
Thursday, 17 March 2016
Thursday, 24 March 2016
Thursday, 31 March 2016
Thursday, 07 April 2016
Thursday, 14 April 2016
Thursday, 21 April 2016
Thursday, 28 April 2016
Thursday, 05 May 2016
Thursday, 12 May 2016
Thursday, 19 May 2016
Thursday, 26 May 2016
Thursday, 02 June 2016
Thursday, 09 June 2016
Thursday, 16 June 2016
Thursday, 23 June 2016
Thursday, 30 June 2016
Thursday, 07 July 2016
Thursday, 14 July 2016
Thursday, 21 July 2016
Thursday, 28 July 2016
Thursday, 04 August 2016
Thursday, 11 August 2016
Thursday, 18 August 2016
Thursday, 25 August 2016
Thursday, 01 September 2016
Thursday, 08 September 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment