いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

vaqt (Goのtimeパッケージ風の日付操作)(C言語)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

Goのとても有用なドキュメントやライブラリを公開してくださっている nalgeon さんが vaqtというC言語のライブラリを公開していました。

antonz.org

github.com

使い勝手が Go の timeパッケージ に似た構成となっているので、Goを知っている人はとても使いやすいライブラリI/Fとなっています。

使い方に関しては、リポジトリのREADME.mdやexampleディレクトリの下にあるので、使い方で迷うことはありませんが、一応自分で触ってみたメモを以下に残しておきます。

準備

C言語のライブラリなので、ソースごと持ってきます。

$ mkdir app
$ cd app
$ git clone --depth=1 https://github.com/nalgeon/vaqt.git
$ touch main.c
$ touch Makefile

サンプル

main.c

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "vaqt.h"

int main(void) {
    char   buf[64]  = {0};
    size_t buf_size = sizeof(buf);

    Time now = time_now();  // 現在時刻

    // 日時表示
    {
        memset(buf, 0, buf_size);
        time_fmt_datetime(now, 0, buf, buf_size);
        printf("time_fmt_datetime: %s\n", buf);

        memset(buf, 0, buf_size);
        int32_t offsets = (60 * 60 * 8);
        time_fmt_datetime(now, offsets, buf, buf_size);
        printf("time_fmt_datetime (with offsets): %s\n", buf);
    }

    // ISOフォーマット
    {
        memset(buf, 0, buf_size);
        time_fmt_iso(now, 0, buf, buf_size);
        printf("time_fmt_iso: %s\n", buf);
    }

    // UNIX秒
    {
        int64_t unix_sec = time_to_unix(now);
        printf("time_to_unix: %ld\n", unix_sec);
    }

    // 時間加算
    Time after_10secs;
    {
        after_10secs = time_add(now, (10 * TIME_SECOND));

        memset(buf, 0, buf_size);
        time_fmt_datetime(after_10secs, 0, buf, buf_size);
        printf("time_add: %s\n", buf);
    }

    // 特定の時刻より後かチェック
    {
        bool ok = time_after(after_10secs, now);
        printf("time_after(after_10secs, now): %s\n", ok ? "TRUE" : "FALSE");
    }

    return EXIT_SUCCESS;
}

Makefile

PROGRAM := app
CC      := gcc
CFLAGS  := -g3 -Wall -Wextra -std=c99
INCDIRS := -Ivaqt/src

.PHONY: run

run:
    $(RM) $(PROGRAM)
    $(CC) $(INCDIRS) -c vaqt/src/*.c
    $(CC) $(CFLAGS) $(INCDIRS) -c main.c
    $(CC) $(CFLAGS) *.o -o $(PROGRAM)
    ./$(PROGRAM)

実行

$ make
rm -f app
gcc -Ivaqt/src -c vaqt/src/*.c
gcc -g3 -Wall -Wextra -std=c99 -Ivaqt/src -c main.c
gcc -g3 -Wall -Wextra -std=c99 *.o -o app
./app

time_fmt_datetime: 2025-10-19 11:07:55
time_fmt_datetime (with offsets): 2025-10-19 19:07:55
time_fmt_iso: 2025-10-19T11:07:55.544821143Z
time_to_unix: 1760872075
time_add: 2025-10-19 11:08:05
time_after(after_10secs, now): TRUE

参考情報

antonz.org


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。