Skip to content

Instantly share code, notes, and snippets.

@jessebutryn
Created October 14, 2017 23:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jessebutryn/7a68702b8ad75932c774bb5e76a395e1 to your computer and use it in GitHub Desktop.
Save jessebutryn/7a68702b8ad75932c774bb5e76a395e1 to your computer and use it in GitHub Desktop.
TimeZone Converter
#! /bin/bash -
#set -x
#
# Copyright (c) 2017 Joyent Inc.
#
# This script will convert times from one timezone to another.
#
# Author: Jesse Butryn <jesse.butryn@joyent.com>
#
# 10/14/2017 - Initial draft.
#
##############################
# Table of Contents
##############################
#
# 1) Variables
# 2) Functions
# 3) Preflight
# 4) Run
#
##############################
# Section 1 Variables
##############################
CONVERT_LOCAL='US/Mountain'
TXT_BLD=$(tput bold)
TXT_YLW=$(tput setaf 3)
TXT_RED=$(tput setaf 1)
TXT_GRN=$(tput setaf 2)
TXT_WARN="${TXT_BLD}${TXT_YLW}"
TXT_ERR="${TXT_BLD}${TXT_RED}"
TXT_OKAY="${TXT_BLD}${TXT_GRN}"
TXT_RST=$(tput sgr0)
CONVERT_TZS=('UTC' 'MDT' 'PDT' 'CDT' 'EDT' 'BST' 'CEST' 'EEST' 'KST' 'SGT' 'AEST' 'NZDT')
##############################
# Section 2 Functions
##############################
echo.help () {
cat <<EOF
This script will convert times from one timezone to another.
Usage: $(basename $0) '01/01/1970 10:00PM'
$(basename $0) [MM/DD/YYYY HH:MM(AM/PM)] [HH:MM(AM/PM)]
EOF
exit 10
}
chooseTZ () {
PS3="${TXT_OKAY}Select a timezone: ${TXT_RST}"
select CONVERT_TZ in "${CONVERT_TZS[@]}"; do
case "$CONVERT_TZ" in
UTC) echo 'UTC'; break ;;
MDT) echo 'US/Mountain'; break ;;
PDT) echo 'US/Pacific'; break ;;
CDT) echo 'US/Central'; break ;;
EDT) echo 'US/Eastern'; break ;;
BST) echo 'Europe/London'; break ;;
CEST) echo 'Europe/Berlin'; break ;;
EEST) echo 'Europe/Vilnius'; break ;;
KST) echo 'Asia/Seoul'; break ;;
SGT) echo 'Asia/Singapore'; break ;;
AEST) echo 'Australia/Sydney'; break ;;
NZDT) echo 'Pacific/Auckland'; break ;;
esac
done
}
checkTIME () {
CONVERT_CHK_TIME="$1"
if [[ "$CONVERT_CHK_TIME" =~ ^(0[0-9]|1[0-2]):[0-9][0-9](AM|PM)$ ]]; then
CONVERT_FORMAT='%I:%M%p'
elif [[ "$CONVERT_CHK_TIME" =~ ^(0[0-9]|1[0-2])\/([0-2][0-9]|3[0-1])\/[0-9][0-9][0-9][0-9]\ (0[0-9]|1[0-2]):[0-9][0-9](AM|PM)$ ]]; then
CONVERT_FORMAT='%m/%d/%Y %I:%M%p'
else
echo.help
exit 1
fi
}
##############################
# Section 3 Preflight
##############################
if [[ -n "$1" ]]; then
checkTIME "$1"
echo "Select an ${TXT_BLD}ORIGIN${TXT_RST} timezone"
CONVERT_FROM="$(chooseTZ)"
CONVERT_TIME="$(TZ="$CONVERT_FROM" date -j -f "$CONVERT_FORMAT" "$CONVERT_CHK_TIME" "+%s")"
else
CONVERT_FROM="${CONVERT_LOCAL}"
CONVERT_TIME="$(date "+%s")"
fi
echo "Select an ${TXT_BLD}DESTINATION${TXT_RST} timezone"
CONVERT_TO="$(chooseTZ)"
##############################
# Section 4 Run
##############################
TIME_IN="$(TZ="$CONVERT_FROM" date -j -f "%s" "$CONVERT_TIME")"
TIME_OUT="$(TZ="$CONVERT_TO" date -j -f "%s" "$CONVERT_TIME")"
cat <<EOF
${TXT_WARN}$TIME_IN${TXT_RST}
Converts to:
${TXT_OKAY}$TIME_OUT${TXT_RST}
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment