Zig 0.16 学习笔记 - 获取本地时间

本次,我想要使用 zeit 库来获取系统本地时间。为此,需要先学习一下怎么在 Zig 中添加一个库。

Zig 官方内置 zig fetch 用于包获取与依赖管理,核心作用是下载第三方包、计算完整性哈希、并自动维护项目的 build.zig.zon 依赖清单。

添加依赖

下面我们就使用 zig fetch 命令来添加 zeit 依赖:

bash
zig fetch --save git+https://github.com/rockorager/zeit

执行命令后,在 build.zig.zon 文件的 dependencies 中就会新增一条记录:

zon
.dependencies = .{
    .zeit = .{
        .url = "git+https://github.com/rockorager/zeit#2a79678e05e4e82cd4efd4fd6b754dcf029c3a64",
        .hash = "zeit-0.6.0-5I6bk7q6AgBdMJxze3D4l9ylQhkviQ_BX9FigDt13MFn",
    },
},

光是如此,我们还是不能使用 zeit 库,还需要同步修改 build.zig 文件,重新定义我们的构建流程,将 zeit 依赖加入我们的构建环节:

zig
const dep_zeit = b.dependency("zeit", .{
    .target = target,
    .optimize = optimize,
});
exe.root_module.addImport("zeit", dep_zeit.module("zeit"));

配置完成后,项目就可以正常使用 zeit 库了。

获取本地时间

zig
const std = @import("std");
const zeit = @import("zeit");

pub fn main(init: std.process.Init) !void {
    const local = try zeit.local(init.gpa, init.io, .{});
    defer local.deinit();

    const now = try zeit.instant(init.io, .{});
    const now_local = now.in(&local);

    var buf: [4096]u8 = undefined;
    var writer = std.Io.Writer.fixed(&buf);
    try now_local.time().strftime(&writer, "%Y-%m-%d %H:%M:%S");
    try print(init.io, "{s}\n", .{writer.buffered()});
}

fn print(io: std.Io, comptime fmt: []const u8, args: anytype) !void {
    var buf: [4096]u8 = undefined;
    var out = std.Io.File.stdout().writerStreaming(io, &buf);
    try out.interface.print(fmt, args);
    try out.interface.flush();
}

构建并运行:

bash
zig build run

在终端可以成功看到当前时间。

体验与感想

体验下来,我认为 Zig 的包管理与构建流程简洁易懂、极易上手。

最令人舒适的一点是,Zig 的构建脚本本身就是 Zig 代码,无需额外学习全新语法或领域专用配置语言。开发者不需要适配陌生的 DSL,只用熟悉一门语言,就能完成编码、构建与工程配置。

一切逻辑可见、可控,给人一种完全掌控项目的通透感。