Rust时间戳处理库tai64的使用,高效转换和操作TAI64N/TAI64NA格式时间戳

Rust时间戳处理库tai64的使用,高效转换和操作TAI64N/TAI64NA格式时间戳

RustCrypto的tai64库提供了对TAI64(N)(国际原子时)时间戳格式的Rust实现。

安装

在项目目录中运行以下Cargo命令:

cargo add tai64

或者在Cargo.toml中添加:

tai64 = "4.1.0"

最低支持的Rust版本

需要Rust 1.60或更新的版本。

许可证

可以选择以下任一许可证:

  • Apache License, Version 2.0
  • MIT license

示例代码

下面是一个完整的示例,展示如何使用tai64库进行TAI64N时间戳的转换和操作:

use tai64::{Tai64, Tai64N};

fn main() {
    // 获取当前系统时间并转换为TAI64
    let now = Tai64::now();
    println!("Current TAI64 timestamp: {:?}", now);
    
    // 从系统时间创建TAI64N (纳秒精度)
    let now_nano = Tai64N::now();
    println!("Current TAI64N timestamp: {:?}", now_nano);
    
    // 从Unix时间戳创建TAI64
    let unix_time = 1609459200; // 2021-01-01 00:00:00 UTC
    let tai64 = Tai64::from_unix(unix_time);
    println!("TAI64 from Unix timestamp: {:?}", tai64);
    
    // 转换为Unix时间戳
    let unix = tai64.to_unix();
    println!("Back to Unix timestamp: {}", unix);
    
    // 解析TAI64N字符串
    let tai64n_str = "4000000037c219d6";
    let parsed = Tai64N::parse(tai64n_str).expect("Invalid TAI64N string");
    println!("Parsed TAI64N: {:?}", parsed);
    
    // 格式化输出
    println!("Formatted TAI64N: {}", parsed.to_string());
    
    // 时间操作
    let one_hour_later = parsed + 3600; // 加1小时(3600秒)
    println!("One hour later: {}", one_hour_later.to_string());
}

功能特点

  1. 支持TAI64和TAI64N(纳秒精度)格式
  2. 与Unix时间戳相互转换
  3. 时间戳解析和格式化
  4. 基本的时间算术操作
  5. 无标准库(no-std)支持

完整示例代码

以下是一个更完整的示例,展示了更多tai64库的功能:

use tai64::{Tai64, Tai64N};
use std::time::{SystemTime, UNIX_EPOCH};

fn main() {
    // 示例1: 获取当前时间并转换
    println!("=== 当前时间转换示例 ===");
    let tai64_now = Tai64::now();
    let tai64n_now = Tai64N::now();
    println!("TAI64当前时间: {}", tai64_now);
    println!("TAI64N当前时间(纳秒精度): {}", tai64n_now);
    
    // 示例2: 从系统时间创建
    println!("\n=== 系统时间转换示例 ===");
    let sys_time = SystemTime::now();
    let tai64_from_sys = Tai64::from_system_time(&sys_time);
    let tai64n_from_sys = Tai64N::from_system_time(&sys_time);
    println!("从SystemTime转换的TAI64: {}", tai64_from_sys);
    println!("从SystemTime转换的TAI64N: {}", tai64n_from_sys);
    
    // 示例3: Unix时间戳转换
    println!("\n=== Unix时间戳转换示例 ===");
    let unix_timestamp = 1672531200; // 2023-01-01 00:00:00 UTC
    let tai64_from_unix = Tai64::from_unix(unix_timestamp);
    println!("从Unix时间戳{}转换的TAI64: {}", unix_timestamp, tai64_from_unix);
    println!("转换回Unix时间戳: {}", tai64_from_unix.to_unix());
    
    // 示例4: 解析和格式化
    println!("\n=== 解析和格式化示例 ===");
    let tai64_str = "4000000037c219d6";
    match Tai64N::parse(tai64_str) {
        Ok(parsed) => {
            println!("解析成功的TAI64N: {}", parsed);
            println!("十六进制表示: {:x}", parsed);
        }
        Err(e) => println!("解析失败: {}", e),
    }
    
    // 示例5: 时间运算
    println!("\n=== 时间运算示例 ===");
    let base_time = Tai64N::now();
    println!("基准时间: {}", base_time);
    println!("加30秒: {}", base_time + 30);
    println!("减15分钟: {}", base_time - 900); // 900秒=15分钟
    
    // 示例6: 比较时间
    println!("\n=== 时间比较示例 ===");
    let time1 = Tai64::now();
    std::thread::sleep(std::time::Duration::from_secs(1));
    let time2 = Tai64::now();
    println!("time1: {}, time2: {}", time1, time2);
    println!("time1 < time2: {}", time1 < time2);
}

功能特点

  1. 支持TAI64和TAI64N(纳秒精度)格式
  2. 与Unix时间戳相互转换
  3. 时间戳解析和格式化
  4. 基本的时间算术操作
  5. 无标准库(no-std)支持

1 回复

Rust时间戳处理库tai64的使用指南

介绍

tai64是一个用于处理TAI64和TAI64N时间戳的Rust库。TAI(国际原子时)是一种不受闰秒影响的时间标准,TAI64和TAI64N是其64位表示形式,常用于需要精确时间戳的场景。

该库提供了:

  • TAI64和TAI64N时间戳的解析和格式化
  • 与系统时间的相互转换
  • 时间戳的算术运算
  • 与其他时间标准的转换

安装

在Cargo.toml中添加依赖:

[dependencies]
tai64 = "3.0"

基本用法

创建TAI64N时间戳

use tai64::TAI64N;

// 获取当前时间的TAI64N时间戳
let now = TAI64N::now();
println!("Current TAI64N timestamp: {}", now);

// 从秒和纳秒创建
let timestamp = TAI64N::from_unix(1_000_000_000, 500_000_000).unwrap();
println!("Timestamp: {}", timestamp);

与系统时间转换

use std::time::SystemTime;
use tai64::TAI64N;

// 系统时间转TAI64N
let system_time = SystemTime::now();
let tai64n = TAI64N::from_system_time(&system_time);
println!("SystemTime to TAI64N: {}", tai64n);

// TAI64N转系统时间
let system_time_back = tai64n.to_system_time();

解析和格式化

use tai64::TAI64N;

// 从字符串解析
let timestamp_str = "4000000037a93c4a00000000";
let parsed = timestamp_str.parse::<TAI64N>().unwrap();
println!("Parsed timestamp: {}", parsed);

// 格式化输出
println!("Hex representation: {}", parsed.to_string());

时间运算

use std::time::Duration;
use tai64::TAI64N;

let now = TAI64N::now();
let one_hour_later = now + Duration::from_secs(3600);
let one_hour_earlier = now - Duration::from_secs(3600);

println!("Now: {}", now);
println!("+1 hour: {}", one_hour_later);
println!("-1 hour: {}", one_hour_earlier);

比较时间戳

use tai64::TAI64N;
use std::thread::sleep;
use std::time::Duration;

let t1 = TAI64N::now();
sleep(Duration::from_secs(1));
let t2 = TAI64N::now();

assert!(t1 < t2);
assert_eq!(t1.cmp(&t2), std::cmp::Ordering::Less);

高级用法

处理TAI64(不带纳秒)

use tai64::TAI64;

let tai64_now = TAI64::now();
println!("TAI64 timestamp: {}", tai64_now);

// 与TAI64N相互转换
let tai64n = tai64_now.to_tai64n();
let back_to_tai64 = tai64n.to_tai64();

自定义格式输出

use tai64::TAI64N;

let now = TAI64N::now();
println!("Unix timestamp: {}", now.unix());
println!("Seconds: {}", now.seconds());
println!("Nanoseconds: {}", now.nanos());

错误处理

use tai64::TAI64N;

let result = TAI64N::from_unix(i64::MAX as u64 + 1, 0);
assert!(result.is_err());
println!("Error: {:?}", result.err().unwrap());

完整示例代码

use std::time::{SystemTime, Duration};
use tai64::{TAI64, TAI64N};

fn main() {
    // 1. 创建时间戳
    println!("=== 创建时间戳 ===");
    let now = TAI64N::now();
    println!("当前TAI64N时间戳: {}", now);
    
    let custom_time = TAI64N::from_unix(1_000_000_000, 500_000_000).unwrap();
    println!("自定义时间戳: {}", custom_time);

    // 2. 系统时间转换
    println!("\n=== 系统时间转换 ===");
    let system_time = SystemTime::now();
    let tai64n = TAI64N::from_system_time(&system_time);
    println!("系统时间 -> TAI64N: {}", tai64n);
    let system_time_back = tai64n.to_system_time();
    println!("TAI64N -> 系统时间: {:?}", system_time_back);

    // 3. 解析和格式化
    println!("\n=== 解析和格式化 ===");
    let timestamp_str = "4000000037a93c4a00000000";
    let parsed = timestamp_str.parse::<TAI64N>().unwrap();
    println!("解析后的时间戳: {}", parsed);
    println!("十六进制表示: {}", parsed.to_string());
    println!("Unix时间戳: {}", parsed.unix());
    println!("秒数: {}", parsed.seconds());
    println!("纳秒: {}", parsed.nanos());

    // 4. 时间运算
    println!("\n=== 时间运算 ===");
    let now = TAI64N::now();
    let one_hour_later = now + Duration::from_secs(3600);
    let one_hour_earlier = now - Duration::from_secs(3600);
    println!("当前: {}", now);
    println!("+1小时: {}", one_hour_later);
    println!("-1小时: {}", one_hour_earlier);

    // 5. TAI64处理
    println!("\n=== TAI64处理 ===");
    let tai64_now = TAI64::now();
    println!("TAI64时间戳: {}", tai64_now);
    let tai64n_from_tai64 = tai64_now.to_tai64n();
    println!("转换为TAI64N: {}", tai64n_from_tai64);
    let back_to_tai64 = tai64n_from_tai64.to_tai64();
    println!("转换回TAI64: {}", back_to_tai64);

    // 6. 错误处理
    println!("\n=== 错误处理 ===");
    match TAI64N::from_unix(i64::MAX as u64 + 1, 0) {
        Ok(_) => println!("创建成功"),
        Err(e) => println!("错误: {}", e),
    }
}

注意事项

  1. TAI时间不考虑闰秒,与UTC时间会有差异
  2. 在跨系统传输时间戳时,TAI64/TAI64N比本地时间更可靠
  3. 对于需要高精度时间戳的场景,TAI64N(带纳秒)比TAI64更合适

这个库非常适合需要精确时间戳记录、跨系统时间同步或需要避免闰秒问题的应用场景。

回到顶部