时间处理基础:Rust 的 chrono 库教程

2024-06-11 13:44

本文主要是介绍时间处理基础:Rust 的 chrono 库教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在开发过程中,我们经常有对时间和日期处理的需求。不论是日历应用、日程安排、还是时间戳记录,准确的时间数据处理都是必不可少的。Rust 社区提供的 chrono 库以其强大的功能和灵活的接口,在 Rust 开发者中广受欢迎。本文将简单介绍 chrono 库,展示如何利用它来精确处理和转换时间和日期,帮助你在任何 Rust 项目中都能高效地管理时间。

版本

  • chrono: 0.4.38

结论先行

chrono 各种时间类型转换图

时间相关概念

概念理解
UNIX 时间戳(UNIX Timestamp)也称为 POSIX 时间或 Epoch 时间,是自 1970 年 1 月 1 日(UTC 时区)以来经过的秒数,不计入闰秒。这是一种非常通用的时间表示方法,在编程中广泛使用,因为它可以简化时间差的计算。
UTC(协调世界时)全称为协调世界时(Coordinated Universal Time),是目前国际上广泛采用的时间标准。它基本上与格林威治平均时(GMT)相同,但在技术上更加精确,因为它使用原子钟来保持时间准确。世界各地的时间都是以 UTC 为基础,加上或减去一定的小时数来定义的。
时区(Time Zone)时区是地球上划分的标准时间区域。由于地球自西向东旋转,每向东移动一定角度,当地的太阳时间就会相应地提前。世界被分成了 24 个时区,每个时区通常相差一小时。时区允许地区内的人们能在大致相同的时间内,经历类似的日夜更替模式。
UTC+8UTC+8 是 UTC 时间加上 8 小时的时间区。中国大陆就是位于这个时区。例如,当 UTC 时间为 00:00 时,UTC+8 的时间就是 08:00。

chrono 关键类型

类型含义适用场景
DateTime<Tz>一个带有时区的日期和时间类型,其中 Tz 是实现了 TimeZone 特质的类型,如 UtcLocal 。这意味着 DateTime 考虑了时区的影响,可以表示全球任意地点的精确时间。广泛用于需要考虑时区转换的场景,如存储用户的本地时间或在不同地区之间转换时间。
NaiveDateTime一个“天真的”日期和时间,即不包含任何时区信息的日期和时间。这种类型仅仅表示一个日历日期和一天中的时间,而没有任何关于地理或政治时区的数据。对于一些时区不重要的场景非常有用,比如记录电影的发行日期或历史事件的日期。
NaiveDate仅表示一个日历日期,不包括时间或时区信息。它用于处理只需要日期而不关心具体时间的场景,如生日、节日等。
NaiveTime是一个只表示一天中时间的类型,它不包含日期或时区信息。这个类型适用于需要处理具体某个时间点(如开会时间、日常活动的开始时间)但不需要日期数据的情景。

chrono 时区类型

chrono 支持多种时区类型,方便进行全球时间的转换和计算:

  • Utc: 用于处理协调世界时。
  • Local: 代表服务器或用户的本地时区。
  • FixedOffset: 允许定义任意的小时和分钟偏移量,适合固定偏移的时间计算。

常用功能

获取当前时间

let local_datetime: DateTime<Local> = Local::now();
let utc_datetime: DateTime<Utc> = Utc::now();

DateTime 转 String

println!("{}", local_datetime.to_rfc2822()); // Sun, 12 May 2024 00:15:55 +0800
println!("{}", local_datetime.to_rfc3339()); // 2024-05-12T00:15:55.325058+08:00
println!("{}", local_datetime.to_string()); // 2024-05-12 00:15:55.325058 +08:00
println!("{}", local_datetime.format("%Y-%m-%d %H:%M:%S")) // 2024-05-12 00:15:55

String 转 DateTime

字符串带时区信息,使用 DateTime::parse_from_str(s, f)

let format_withzone = "%Y-%m-%d %H:%M:%S %z";
let datetime_withzone_str = "2024-01-01 00:00:00 +08:00";
let local_datetime =DateTime::parse_from_str(&datetime_withzone_str, &format_withzone).unwrap();

字符串无时区信息,使用 NaiveDateTime::parse_from_str(s, f)

let format = "%Y-%m-%d %H:%M:%S";
let datetime_str = "2024-01-01 00:00:00";
let local_datetime = NaiveDateTime::parse_from_str(&datetime_str, &format).unwrap().and_local_timezone(Local) // 转为带时区的 DateTime.unwrap();

DateTime 转 timestamp

let local_datetime = Local::now();
println!("seconds: {}", local_datetime.timestamp()); // 1715444324
println!("millis: {}", local_datetime.timestamp_millis()); // 1715444338610
println!("micros: {}", local_datetime.timestamp_micros()); // 1715444338610873
println!("nacos: {}", local_datetime.timestamp_nanos_opt().unwrap()); // 1715444338610873000

timestamp 转 DateTime

let utc_datetime: DateTime<Utc> = DateTime::from_timestamp(1704139200, 0).unwrap(); // 默认是 Utc
let local_datetime: DateTime<Local> = DateTime::from_timestamp(1704139200, 0).unwrap().into(); // 使用 into() 转为 Local

时区转换

use chrono::{DateTime, FixedOffset, Utc};fn main() {let utc_date_time: DateTime<Utc> = Utc::now();let fixed_offset = FixedOffset::east(8 * 3600); // 转为 utc+8 东八区let local_date_time = utc_date_time.with_timezone(&fixed_offset);println!("Local time in UTC+8: {}", local_date_time);
}

时间计算

时间加减:

use chrono::{Duration, Local};let now = Local::now();
let yesterday = now - Duration::hours(24);

chrono time duration methods

时间间隔:

use chrono::{Duration, Local};let now = Local::now();
let yesterday = now - Duration::hours(24);
let hour_interval = (now - yesterday).num_hours();

chrono time interval methods

总结

通过本文的详细介绍和实用示例,我们了解了如何使用 Rust 的 chrono 库来精确处理时间和日期。chrono 不仅支持复杂的时区计算和全球时间管理,还提供了方便的日期时间解析和格式化工具,以及灵活的时间运算功能。掌握了这些技能后,你将能够在任何需要精确时间数据处理的 Rust 应用中,提供稳定和高效的解决方案。

时间是每个程序的基石,而 chrono 就是那把能够操纵时间的魔杖。

希望本文能对你有帮助,peace! enjoy coding~

参考:

  • chrono crate
  • rust-working-with-date-and-time

作图:

  • https://excalidraw.com/

这篇关于时间处理基础:Rust 的 chrono 库教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051329

相关文章

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处