💾 Archived View for zaibatsu.circumlunar.space › ~bandali › software › tmdconv › tmdconv.sh captured on 2024-08-18 at 19:30:48.

View Raw

More Information

⬅️ Previous capture (2024-05-10)

-=-=-=-=-=-=-

#!/bin/sh
# tmdconv.sh --- tiny menu-based date converter

# Copyright (c) 2024 Amin Bandali <bandali@kelar.org>
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.  This file is offered as-is,
# without any warranty.

# https://kelar.org/~bandali/software/tmdconv/
# gopher://kelar.org/1/~bandali/software/tmdconv/
# gopher://zaibatsu.circumlunar.space/1/~bandali/software/tmdconv/
# gemini://zaibatsu.circumlunar.space/~bandali/software/tmdconv/


tzdata="${tzdata:-/usr/share/zoneinfo/tzdata.zi}"

usage()
{
    cat <<EOF
Usage: $0 [OPTIONS]

The following OPTIONS are accepted:
 -g  run in graphical user interface mode
 -l  display longer output
 -h  print help and exit
EOF
    exit "$1"
}

ask()
{
    # $1: newline-separated choices
    # $2: prompt string
    # $3: pre-filled initial answer (if supported)

    if [ "$gui" ]; then
        if [ "$WAYLAND_DISPLAY" ]; then
            menu_font='Source Code Pro Medium 10.5'
            printf "$1" | wmenu -i -p "$2" -f "$menu_font"
        else
            menu_font='Source Code Pro Medium-10.5'
            printf "$1" | dmenu -i -p "$2" -fn "$menu_font"
        fi
    else
        printf "$1" \
            | fzf --print-query --prompt="$2" --query="$3" \
            | tail -n -1
    fi
}

say()
{
    if [ "$gui" ]; then
        notify-send "$1"
    else
        printf "$1\n"
    fi
}

systemtz()
{
    # get system's time zone, by looking at the
    # destination of the /etc/localtime symlink

    timezone="$(readlink /etc/localtime)"
    timezone="$(cd /etc && realpath -m -s "$timezone")"
    printf "${timezone#/usr/share/zoneinfo/}"
}


gui=
long=
while getopts glh opt
do
    case $opt in
        g) gui=1 ;;
        l) long=1 ;;
        h) usage 0 ;;
        *) usage 2 ;;
    esac
done

shift $(($OPTIND - 1))
if [ "$#" -gt 0 ]; then
    usage 1
fi


if [ ! -f "$tzdata" ]; then
    msg=$(cat <<EOF
error: time zone data not found at $tzdata

note: you can set the 'tzdata' variable to point to the location of tzdata.zi
EOF
       )
    say "$msg"
    exit 1
fi

# current time zone per $TZ, falling back to system's
tz="${TZ:-$(systemtz)}"

# all time zones known to the system
zonenames="$(awk '/^Z/ { print $2 } /^L/ { print $3 }' $tzdata)"

datefrom="$(ask '' 'Convert date/time ')"

tzfrom="$(ask "$zonenames" 'in time zone ' "$tz")"

tzto=
if [ "$tzfrom" = "$tz" ]; then
    tzto="$(ask "$zonenames" 'to time zone ')"
else
    tzto="$(ask "$zonenames" 'to time zone ' "$tz")"
fi

dateto="$(TZ="$tzto" date --date="TZ=\"$tzfrom\" $datefrom")"

if [ "$long" ]; then
    say "$datefrom ($tzfrom) is $dateto ($tzto)"
else
    say "$dateto"
fi