Skip to content

Neved4/twc

Repository files navigation

C IEEE CodeQL

twc - Tiny world clock in C! 🛠️

Fast, CLI world clock that displays time zone information using tz database to read valid tz entries.

$ twc -h -f tools/samples/tz-small.conf
America/New York     2023-12-10  16:39:43  -0500
America/Los Angeles  2023-12-10  13:39:43  -0800
UTC                  2023-12-10  21:39:43  +0000
Europe/London        2023-12-10  21:39:43  +0000
Europe/Paris         2023-12-10  22:39:43  +0100
Asia/Tokyo           2023-12-11  06:39:43  +0900
Australia/Sydney     2023-12-11  08:39:43  +1100

Highlights

  • 🚀 Fast - 5X times faster than date.1 Only ≈ 8 ms for one entry, and ≈ 177 ms for ≈ 600 entries.
  • 🔒 Robust - tested to work with all tz database entries, version 2023c.
  • 📦 Self-contained - zero dependencies, ISO C99, lightweight (132 lines, 2659 bytes).

Getting Started

Setup

Clone the repository:

git clone https://github.com/Neved4/twc

Build the sources:

$ make twc
cc twc.c -o twc

Alternatively, if you have zig installed:

$ zig cc twc.c -t twc

Usage

twc [-h] [-s FORMAT] [-f FILE | -t ENTRY] ...

Options:
    -h  Prints time in “human-readable” output instead of ISO 8601.
    -f  Specify a file to read entries from.
    -s  Use a different date format to print the time.
    -t  Manually specify a tz database entry.

Files:
    ~/.config/twc/tz.conf
        Stores valid tz database identifiers to be displayed by twc.

Examples:
    $ twc -h -s %Y-%m-%d -t Asia/Tokyo
        2006-01-02

    $ TZ=America/Los_Angeles twc
        2006-01-02T15:04:05-0800

Environment:
    TZ  Timezone to use when displaying dates. See environ(7).

See also:
    time(3), strftime(3), environ(7)

Docker

To compile the binary inside a Docker image, run:

docker build .

Compatibility

Runs on Linux, macOS and *BSD systems on x86_64 and arm64, and compiles with zig, clang, gcc, tcc and any other compiler that supports C99 or later.

Standards

twc is compatible with POSIX.1-20172 as well as C233, and it outputs ISO 86014 format.

Acknowledgments

Special thanks to everybody who helped me with pointers and memory allocation, @enigmatico and @K4rakara for her code review, and @finnoleary, for getting me started.

License

twc is licensed under the terms of the MIT License.

See the LICENSE file for details.

Footnotes

  1. cfr. date command takes ≈ 931 ms when iterating over ≈ 600 entries. Measured with hyperfine.

  2. IEEE Std 1003.1-2017: Standard for Information Technology — Portable Operating System Interface (POSIX®),
    ISO/IEC/IEEE 9945:2009/COR 2:2017. URL: https://pubs.opengroup.org/onlinepubs/9699919799/

  3. ISO/IEC 9899: Standard for Information Technology — Programming languages — C, ISO/IEC 9899:2023.
    URL: https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf

  4. ISO 8601: Date and time — Representations for information interchange, ISO 8601-1:2019.
    URL: https://www.iso.org/obp/ui/#iso:std:iso:8601:-2:ed-1:v1:en