时间处理基础: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

相关文章

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.