X-Git-Url: https://zdv2.bktei.com/gitweb/BK-2020-03.git/blobdiff_plain/b29fc43b4fc448c2b198b02dd560d67dac61de6a..4a0d0e9acd5d9a1cc7612dbcdb87452f888e4423:/user/bkdatev diff --git a/user/bkdatev b/user/bkdatev index f2f92ec..fb0b96c 100755 --- a/user/bkdatev +++ b/user/bkdatev @@ -2,15 +2,20 @@ # Desc: Baltakatei's verbose date command # Usage: bkdatev [args] # Example: bkdatev --date="2001-09-11T09:02:59-04" -# Version: 0.3.0 +# Version: 1.0.4 +# Depends: GNU Coreutils 8.32, Bash 3.2.57, tzdata-legacy # Ref/Attrib: [1] "ISO 8601". Wikipedia. https://en.wikipedia.org/wiki/ISO_8601 # [2] "Changing the Locale in Wine" https://stackoverflow.com/a/16428951 # [3] "Shanghai vs Beijing" https://bugs.launchpad.net/ubuntu/+source/libgweather/+bug/228554 +# [4] “Understanding the "right" time zone database” https://kenta.blogspot.com/2016/03/sqfzcxay-understanding-right-time-zone.html # Notes: * Check `ls -R /usr/share/zoneinfo` for time zone names. # * Check `cat /usr/share/i18n/SUPPORTED` for supported locales. # * For list of valid locales, see: https://manpages.ubuntu.com/manpages/bionic/man3/DateTime::Locale::Catalog.3pm.html # * Locations chosen for population, personal signifiance, and spatial coverage. # * For International Atomic Time (TAI), use offsets from UTC provided in `/usr/share/zoneinfo/leap-seconds.list`. +# * Compatibility with macOS may be limited if any arguments +# are provided when running `bkdatev`; e.g. passing a +# `--date` option to `bkdatev` will fail. yell() { echo "$0: $*" >&2; } die() { yell "$*"; exit 111; } @@ -71,19 +76,22 @@ get_tz_offset() { # Desc: Get from 'date' the timezone UTC offset in a way # compatible with both GNU Coreutils and BSD versions. # Input: env var: TZ (time zone for date; e.g. 'America/Denver') + # args: $@ # passed onto `date` # Depends: date (GNU Coreutils 8.32 or BSD), rev local ntz ntz ntz_out; local last2; # Get numeric time zone string in way compatible with GNU Coreutils and BSD - ntz="$(date "+%z")"; # e.g. "+0530" + ntz="$(date "+%z" "$@")"; # e.g. "+0530" # Check if last two characters are trailing zeros that can be removed. last2="${ntz:3:2}"; # assumes $ntz is 5 characters (i.e. "±HHMM") #last2="$(rev <<< $ntz)" && last2="${last2:0:2}" && last2="$(rev <<< "$last2")"; if [[ "$last2" == "00" ]]; then ## ntz_out is truncated by 2 characters - ntz_out="${ntz:0:-2}"; + len_ntz="${#ntz}"; + len_ntz_out="$(( len_ntz - 2 ))"; + ntz_out=""${ntz:0:$len_ntz_out}; else ## ntz_out is ntz with semicolon inserted after HH ntz_out="$(insertStr "$ntz" 3 ":" )"; @@ -97,7 +105,7 @@ print_dateline() { # var: $fs_1 # var: $fs_2 # var: $fs_3 - # args: $@ + # args: $@ # passed on to `date` # env var: TZ (time zone for date; e.g. 'America/Denver') # Output: stdout # Depends: printf, date @@ -109,10 +117,10 @@ print_dateline() { s_2="$(date "$@" "$fs_1")"; # ISO-8601 without numeric timezone s_3="$(date "$@" "$fs_2")"; # Alternate ISO-8601 expressions s_4="$(date "$@" "$fs_3")"; # locale-specific date strings - + # Append numeric timezone to $s_2 with appropriate format # (e.g. '-07' for 'Arizona', '+05:45' for 'Asia/Kathmandu') - s_2_tz="$(get_tz_offset)"; + s_2_tz="$(get_tz_offset "$@")"; s_2="$( printf "%s%s" "$s_2" "$s_2_tz" )"; printf "%-10.10s %-25.25s (%-20.20s) (%s)" "$s_1" "$s_2" "$s_3" "$s_4"; @@ -138,7 +146,14 @@ main() { ( export TZ=UTC; id="UTC"; - fs_3="+%s seconds since 1970-01-01T00:00+00"; + path_right_tz="/usr/share/zoneinfo/right/UTC"; + if [[ -f "$path_right_tz" ]]; then + date_string="$(date -Is "$@"; )"; + right_epoch="$(TZ=right/UTC date --date="$date_string" +%s;)"; # see [4] + fs_3="+%s POSIX seconds (${right_epoch} real) since 1970-01-01T00:00+00"; + else + fs_3="+%s POSIX seconds since 1970-01-01T00:00+00"; + fi; print_dateline "$@"; ); line_sep; @@ -254,6 +269,14 @@ main() { print_dateline "$@"; ); line_sep; + # Helsinki, Finland + ( + export TZ=Europe/Helsinki; + export LANG="fi_FI.UTF8"; + id="HELSINKI"; + print_dateline "$@"; + ); line_sep; + # Cairo, Egypt ( export TZ=Africa/Cairo; @@ -262,6 +285,22 @@ main() { print_dateline "$@"; ); line_sep; + # Gaza City, Palestine (pop. (2017): 590,481) + ( + export TZ=Asia/Gaza; + export LANG="ar_JO.UTF-8"; # ar_PS is missing as of 2023-10-18, using ar_JO as closest substitute. + id="GAZA"; + print_dateline "$@"; + ); line_sep; + + # Tel Aviv, Israel (pop. (2021): 467,875) + ( + export TZ=Asia/Tel_Aviv; + export LANG="he_IL.UTF-8"; + id="TEL AVIV"; + print_dateline "$@"; + ); line_sep; + # Athens (pop. (2020): 3,526,887) ( export TZ=Europe/Athens;