#timezone #time #zone

rtz-build

用于构建 rtz 的构建库

7 个版本

新版本 0.2.7 2024年8月15日
0.2.6 2023年8月4日
0.2.4 2023年7月26日
0.1.0 2023年7月25日

#1054命令行工具

每月49次 下载
用于 rtz

MIT 许可

72KB
1K SLoC

Build and Test codecov Version Crates.io GitHub all releases npm Documentation Rust License:MIT

rtz

A self-contained geo lookup library / binary / server for Rust / JS (via WASM) (free server) using data from the Natural Earth and OpenStreetMap datasets.

免费服务器

服务器已部署到全球四个地区,可在 tz.twitchax.com 访问。每个地区目前可支持约 8,000 RPS,并部署到以下地区:sea、iad、ams、hkg。

此外,服务器现在将一般性地尝试在不打破 API 版本向后兼容性的情况下进行。这意味着服务器(尝试)不会更改特定 API 版本的响应格式,并且(尝试)不会从响应中删除任何字段。这并不意味着服务器不会向响应中添加字段,但它(尝试)不会删除它们。

请求的形式为 http://tz.twitchax.com/api/v1/osm/tz/{lng}/{lat}。您还可以查看 API 文档 以探索其他端点和版本策略。

示例请求

$ curl http://tz.twitchax.com/api/v1/osm/tz/30/30

[{"id":12,"identifier":"Africa/Cairo","shortIdentifier":"EEST","offset":"UTC+03:00","rawOffset":10800,"rawBaseOffset":7200,"rawDstOffset":3600,"zone":3.0,"currentTime":"2023-07-25T23:39:59.385469400+03:00"}]

HTTPS 也可用,但由于客户端和服务器性能开销以及未传输敏感数据,不推荐使用。

二进制使用

安装

Windows

$ iwr https://github.com/twitchax/rtz/releases/latest/download/rtz_x86_64-pc-windows-gnu.zip
$ Expand-Archive rtz_x86_64-pc-windows-gnu.zip -DestinationPath C:\Users\%USERNAME%\AppData\Local\Programs\rtz

Mac OS (Apple Silicon)

$ curl -LO https://github.com/twitchax/rtz/releases/latest/download/rtz_aarch64-apple-darwin.zip
$ unzip rtz_aarch64-apple-darwin.zip -d /usr/local/bin
$ chmod a+x /usr/local/bin/rtz

Linux

$ curl -LO https://github.com/twitchax/rtz/releases/latest/download/rtz_x86_64-unknown-linux-gnu.zip
$ unzip rtz_x86_64-unknown-linux-gnu.zip -d /usr/local/bin
$ chmod a+x /usr/local/bin/rtz

Cargo

$ cargo install rtz

NPM

$ npm install --save rtzweb

帮助文档

$ rtz

A tool to easily work with geo lookups via a binary, a library, or a server.

Usage: rtz [COMMAND]

Commands:
  ned           The Natural Earth Data dataset based operations
  osm           The OpenStreetMap dataset based operations
  dump-geojson  Resolve a timezone from a lng,lat pair using the OSM dataset
  serve         Serve the timezone API
  help          Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

解析时区

$ rtz ned tz "-87.62,41.88"

Identifier:      America/Chicago
UTC Offset:      UTC-06:00
Offset Seconds:  -21600
Description:     Canada (almost all of Saskatchewan), Costa Rica, El Salvador, Ecuador (Galapagos Islands), Guatemala, Honduras, Mexico (most), Nicaragua,
DST Description: Canada (Manitoba), United States (Illinois, most of Texas)

使用 Wasmer 运行

wasmer run twitchax/rtz@latest -- ned tz 30,30

运行服务器

$ cargo install rtz --features web
$ rtz serve
$ docker run -it --rm -p 8082 twitchax/rtz

库使用

将此添加到您的 Cargo.toml

[dependencies]
rtz = "*" #choose a version

示例

use rtzlib::NedTimezone;
use rtzlib::CanPerformGeoLookup;

// Query a time zone for a given `(lng,lat)`.
assert_eq!(
    NedTimezone::lookup(-121., 46.)[0]
        .identifier
        .as_ref()
        .unwrap(),
    "America/Los_Angeles"
);

JS 使用

npm 包可在 此处 获得。

首先,像其他任何 ES 模块一样加载模块。

import * as rtz from 'rtzweb/rtzlib.js';

然后,您可以使用库就像在 Rust 中一样。

let tz = rtz.getTimezoneNed(-121, 46);
tz.identifier; // "America/Los_Angeles"

功能标志

库和二进制文件都支持各种功能标志。以下是可用的标志

  • 顶级
    • default= ["cli"]
    • full= ["tz-ned", "tz-osm", "admin-osm", "self-contained"]
  • 数据集
    • tz-ned:启用 Natural Earth 时区数据集和相关产生的库函数。
    • tz-osm:启用 OpenStreetMap 时区数据集和相关产生的库函数。
    • admin-osm:启用OpenStreetMap行政数据集及其相关库函数。
  • 二进制配置
    • cli:启用CLI功能,如果仅编译库,则可以移除。
    • self-contained:启用自包含功能,将数据集嵌入到二进制中构建。
    • double-precision:在所有地方使用f64作为GeometryPolygon数据类型,比f32更精确但更大。
    • unsimplified:生成未简化的数据缓存。需要更多的二进制/内存开销,但更精确。使用原始数据集的详细程度。默认情况下,简化到0.0001的epsilon(通常是)。
    • extrasimplified:生成额外简化的数据缓存。需要更少的二进制/内存开销,但精度较低。将简化epsilon设置为0.01(通常是)。
    • owned-decode:在bincode包的decode功能中使用owned而不是borrow。这通过不直接从二进制映射数据来增加内存占用,但安全性较低/暗黑魔法较少。
  • 特殊修饰符
    • wasm:启用WASM功能,需要通过wasm-pack构建NPM包或生成wasi二进制文件。
    • web = ["full"]:启用serve子命令,该命令启动一个Rocket Web服务器,可以响应用时区请求。
  • 其他注意事项
    • wasm / wasi构建目前与reqwestzip不兼容,因此wasm / wasi构建需要self-contained功能。

数据更新

最后更新是在2024.08.08进行的。该日期的数据源如下

  • OSM Admin Data。这些数据是从OSM星球文件下载的,然后本地处理以提取行政边界。
  • OSM TZ Data。这些数据是从时区边界构建器的最新生成版本中下载的,并由本代码自动处理。
  • NED TZ Data。这些数据是从NED向量仓库的master分支下载的,并由本代码自动处理。

性能

一般

该实现通过采用二进制缓存以性能换取二进制大小,通过二进制缓存提高了平均时区解析能力约96倍,最坏情况下的解析能力约10倍。使用OSM数据集时,平均时区查找时间为约930 ns,使用NED数据集时约为460 ns。最坏情况下的查找时间约为6 - 10 μs

Bench

平均而言,对于随机城市,使用OSM数据集的查找时间约为1.5 μs,使用NED数据集的查找时间约为400 ns

Bench

免费服务器

以下是从(lng,lat)对解析到一个数据中心的时间区的一个示例性能,使用1000个并发连接,达到每秒8000次请求(RPS)。

Drill Perf 1

以下是从(lng,lat)对解析到一个数据中心的时间区的一个示例性能,使用100个并发连接,平均响应时间约为24 ms

Drill Perf 2

测试

cargo test --features web

基准测试

cargo bench --features web

许可证

MIT

依赖项

~12–28MB
~363K SLoC