Skip to content

Instantly share code, notes, and snippets.

@dedeibel
Created November 27, 2019 18:17
Show Gist options
  • Save dedeibel/c5d1df556614ddc20d16dc803ed9013c to your computer and use it in GitHub Desktop.
Save dedeibel/c5d1df556614ddc20d16dc803ed9013c to your computer and use it in GitHub Desktop.

Revisions

  1. dedeibel created this gist Nov 27, 2019.
    114 changes: 114 additions & 0 deletions epoch.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,114 @@
    #!/bin/bash

    #FORMAT="--iso-8601=ns"
    FORMAT="+%Y-%m-%d %H:%M:%S"
    TZ=`date ${UTC} +%z`

    NANO=1000000000
    MICRO=1000000
    MILLI=1000
    MIN_SECONDS=1000000000

    if [[ $1 == "-l" ]]; then
    shift
    # could be an utc/local argument
    fi

    VAL=$1

    function dateFromSeconds {
    S=$1
    SUB=$2

    FORMAT_SUFFIX=
    if [[ -n $SUB ]]; then
    FORMAT_SUFFIX=".${SUB}"
    fi

    date --utc "${FORMAT}${FORMAT_SUFFIX} %z" --date "@${S}"
    echo
    date "${FORMAT}${FORMAT_SUFFIX} %z" --date "@${S}"
    }

    function maskUpper {
    VAL=$1
    PREC=$2
    echo $(($VAL / $PREC))
    }

    function maskLower {
    VAL=$1
    PREC=$2
    SECONDS_PART=$((($VAL / $PREC) * $PREC))
    echo $(($VAL - $SECONDS_PART))
    }

    function printVariants {
    VAL=$1
    PREC=$2
    IN_NANOS=`echo "scale=9; $VAL / ($PREC / $NANO)" | bc`
    IN_MICROS=`echo "scale=9; $VAL / ($PREC / $MICRO)" | bc`
    IN_MILLIS=`echo "scale=9; $VAL / ($PREC / $MILLI)" | bc`
    IN_SECONDS=`echo "scale=9; $VAL / $PREC" | bc`
    printf "%.0f ns\n%.3f us\n%.6f ms\n%.9f s" "$IN_NANOS" "$IN_MICROS" "$IN_MILLIS" "$IN_SECONDS"
    #printf "%.0fns %.3fus %.6fms %.9fs" "1.0" "0.001" "0.000001" "0.000000001"
    }

    function fromNanos {
    N=$1
    printVariants $N $NANO
    echo -e "\n"
    SECONDS=`maskUpper $N $NANO`
    NANOS_ONLY=`maskLower $N $NANO`
    NANOS_FORMATTED=`printf "%09dns" "$NANOS_ONLY"`
    dateFromSeconds $SECONDS $NANOS_FORMATTED
    echo -e "\nSubseconds:\n"
    printVariants $NANOS_ONLY $NANO
    echo
    }

    function fromMicros {
    N=$1
    printVariants $N $MICRO
    echo -e "\n"
    SECONDS=`maskUpper $N $MICRO`
    MICROS_ONLY=`maskLower $N $MICRO`
    MICROS_FORMATTED=`printf "%06dus" "$MICROS_ONLY"`
    dateFromSeconds $SECONDS $MICROS_FORMATTED
    echo -e "\nSubseconds:\n"
    printVariants $MICROS_ONLY $MICRO
    echo
    }

    function fromMillis {
    N=$1
    printVariants $N $MILLI
    echo -e "\n"
    SECONDS=`maskUpper $N $MILLI`
    MILLIS_ONLY=`maskLower $N $MILLI`
    MILLIS_FORMATTED=`printf "%03dms" "$MILLIS_ONLY"`
    dateFromSeconds $SECONDS $MILLIS_FORMATTED
    echo -e "\nSubseconds:\n"
    printVariants $MILLIS_ONLY $MILLI
    echo
    }

    function fromSeconds {
    SECONDS=$1
    printVariants $SECONDS 1
    echo -e "\n"
    dateFromSeconds $SECONDS
    echo
    }

    if [[ $VAL -gt $(($MIN_SECONDS * $NANO)) ]]; then
    fromNanos $VAL
    elif [[ $VAL -gt $(($MIN_SECONDS * $MICRO)) ]]; then
    fromMicros $VAL
    elif [[ $VAL -gt $(($MIN_SECONDS * $MILLI)) ]]; then
    fromMillis $VAL
    elif [[ $VAL -gt $MIN_SECONDS ]]; then
    fromSeconds $VAL
    else
    printVariants $VAL 1
    fi