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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNode(head);ListNode* l1 head;ListNode* l2 mid->next;mid->next nullptr;l2 reverseList(l2);mergeList(l1, l…

腾讯云大数据ES Serverless

Elasticsearch&#xff1a;日志和搜索场景首选解决方案。 技术特点&#xff1a;分布式、全文搜索和数据分析引擎&#xff0c;可以对海量数据进行准实时地存储、搜索和统计分析。 ES的技术栈一共包含四个组件&#xff1a; 其中最核心的是Elasticsearch&#xff0c;可用于数据…

Django学习(2)项目实战

1、环境及简介 前端开发&#xff1a;HTML、CSS、JavaScript 后端开发&#xff1a;Java、PHP、Python、GO 数据库&#xff1a;MySQL、MSSQL、Oracle、Redis 安装Django pip install Django 或 下载.whl后 pip install D&#xff1a;\xxx.whl 创建Django项目 File--New Projec…

stm32MP135裸机编程:修改官方GPIO例程在DDR中点亮第一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf 正点原子stm32mp135开发板&原理图 STM32Cube_FW_MP13_V1.1.0 STM32CubeIDE v1.151 需要修改那些地方 1.1 修改LED引脚 本例使用开发板的PI3引脚链接的LED作为我们点亮的第一颗LED灯&#xff0c;…

在idea中创建Scala项目教程

1.下载Scala支持插件 文件-设置-插件-marketplace 搜索Scala 下载 2.创建项目 文件-新建-项目-新项目-构建系统maven 3.创建Scala目录 Scr-main(右键)-新建-目录&#xff08;Scala回车键&#xff09;-scala(右键)-将项目标记为-源代码根目录 4.对当前项目引入Scala支持 未添…

Tdengine的时序数据库简介、单机部署、操作语句及java应用

Tdengine的时序数据库简介、单机部署、操作语句及java应用 本文介绍了Tdengine的功能特点、应用场景、超级表和子表等概念&#xff0c;讲述了Tdengine2.6.0.34的单机部署&#xff0c;并介绍了taos数据库的常见使用方法及特色窗口查询方法&#xff0c;最后介绍了在java中的应用。…

【差分数组】1674. 使数组互补的最少操作次数

本文涉及知识点 差分数组 LeetCode1674. 使数组互补的最少操作次数 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit 。每一次操作&#xff0c;你可以将 nums 中的任何整数替换为 1 到 limit 之间的另一个整数。 如果对于所有下标 i&#xff08;下标从 0 开始&…

详解 Flink 的容错机制

一、检查点 Checkpoint 1. 介绍 有状态流应用中的检查点&#xff08;checkpoint&#xff09;&#xff0c;其实就是所有任务的状态在某个时间点的一个快照&#xff08;一份拷贝&#xff09;&#xff0c;这个时间点应该是所有任务都恰好处理完一个相同的输入数据的时刻。在一个流…

C++ | Leetcode C++题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode *root) {vector<int> res;if (root nullptr) {return res;}TreeNode *p1 root, *p2 nullptr;while (p1 ! nullptr) {p2 p1->left;if (p2 ! nullptr) {…

linux centos如何安装python3版本但不能影响默认python2版本

在CentOS上安装Python3而不影响系统默认的Python2,具有如何安装呢? 1. 更新系统包 首先,确保系统包是最新的: sudo yum update -y2. 安装EPEL存储库 EPEL(Extra Packages for Enterprise Linux)存储库包含许多额外的软件包,包括Python3: sudo yum install epel-rel…

MATLAB基础应用精讲-【数模应用】二元Logit分析

目录 算法原理 数学模型 极大似然法 Newton牛顿迭代法 logit回归分析步骤 一、二元logit分析 1.基本说明 2.数据处理 3.SPSSAU上传数据 4.分析前提示 5.SPSSAU分析 6.其它说明 二、多分类logit分析 1.基本说明 2.数据要求与处理 3.SPSSAU上传数据 4.SPSSAU分析…

Maven 插件

Maven 插件 Maven 是一个强大的项目管理工具,它通过插件来实现构建、测试、打包和部署等功能。Maven 插件是 Maven 的核心组成部分,它们扩展了 Maven 的功能,使其能够处理各种构建任务。本文将详细介绍 Maven 插件的概念、工作原理、如何使用和创建插件,以及一些流行的 Ma…

QT获取最小化,最大化,关闭窗口事件

QT获取最小化&#xff0c;最大化&#xff0c;关闭窗口事件 主程序头文件&#xff1a; 实现&#xff1a; changeEvent&#xff0c;状态改变事件 closeEvent触发点击窗口关闭按钮事件 其代码它参考&#xff1a; /*重写该函数*/ void MainWindow::changeEvent(QEvent *event) {…

2024-6-10-zero shot,few shot以及无监督学习之间的关系是什么

Zero-shot learning、few-shot learning和无监督学习都是机器学习中的方法&#xff0c;它们共同的特点是在有限或没有标签数据的情况下进行学习。下面是这三种方法之间的关系和区别&#xff1a; Zero-shot Learning (零样本学习)&#xff1a; 零样本学习是在模型训练过程中完全…

计算机毕业设计hadoop+spark+hive舆情分析系统 微博数据分析可视化大屏 微博情感分析 微博爬虫 微博大数据 微博推荐系统 微博预测系统

本 科 毕 业 论 文 论文题目&#xff1a;基于Hadoop的热点舆情数据分析与可视化 姓名&#xff1a; 金泓羽 学号&#xff1a; 20200804050115 导师&#xff1a; 关英 职称&…

matlab演示银河系转动动画

代码 function GalaxyRotationSimulation()% 参数设置num_stars 1000; % 恒星数量galaxy_radius 1; % 银河系半径rotation_speed 0.05; % 旋转速度% 生成银河系中的恒星分布theta 2 * pi * rand(num_stars, 1); % 角度r galaxy_radius * sqrt(rand(num_stars, 1)); % 半径…

XUbuntu24.04之制作ISO镜像启动盘(二百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【html】如何利用HTML+CSS制作自己的印章

大家有没有尝试过用HTML和CSS制作自己的印章. 首先印章具有两个最基本的特点就是它是圆形的并且有边框 当然它还有一些其他的属性吗&#xff0c;废话不多说我们直接上源码&#xff1a; 效果图&#xff1a; 源码&#xff1a; html&#xff1a; <!DOCTYPE html> <h…

51单片机STC89C52RC——1.1点亮一个LED

目录 STC单片机模块 LED模块 创建Keil项目 代码 效果 STC单片机模块 我们程序中要点亮的LED灯的位置如下图。 我们程序要用到的针脚如下图 LED模块 电路图如下 8个LED&#xff0c;全部点亮 每一bit位 都需要设置为0 二进制是0000 0000 。如果只点亮D1一个&#xff…

Docker高级篇之Docker-compose容器编排

文章目录 1. Docker-compse介绍2. Docker-compse下载3. Docker-compse核心概念4. Docker-compse使用案例 1. Docker-compse介绍 Docker-compose时Docker官方的一个开源的项目&#xff0c;负责对Docker容器集群的快速编排。Docker-compose可以管理多个Docker容器组成一个应用&a…