twc

⌚️ Tiny world clock in C!

MIT License

Stars
4

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 (143 lines, 2980 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] [-f path] [-s format] [-t timezone] ...

Options:
  -f path
      Read config from path (default "$HOME/.config/twc/tz.conf")
  -h
      Print in human-readable format
  -s format
      Set desired time format (e.g. "%Y-%m-%d")
  -t timezone
      specific timezone (e.g. "Asia/Tokyo")

Examples:
  Print Tokyo's date in a human-readable format with YY-MM-DD format:

    $ twc -h -s %Y-%m-%d -t Asia/Tokyo
    2024-01-02
  
  Print date in Los Angeles using an environment variable for the timezone:
  
    $ TZ=America/Los_Angeles twc
    2024-01-02T15:04:05-0800

Environment:
  TZ
    Timezone to use when displaying dates.
  XDG_CONFIG_HOME
    When defined, it will be used to store the tz.conf file.

Files:
  ~/.config/twc/tz.conf
    Stores tz database entries to be displayed.

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-2017[^2] as well as C23[^3], and it outputs ISO 8601[^4] 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.

[^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