Rust : chrono库,DateTime、FixedOffset等

本文深入探讨了Rust编程语言中时间处理的方法,特别是chrono和time库的使用,以及FixedOffset在处理不同时区时间转换上的应用。通过具体实例展示了如何将UTC时间转换为特定时区的时间,以及如何在FixedOffset中进行时间加减运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关的库:

extern crate time; 
use chrono::prelude::*;
use time::Duration;

chrono库和time库是藕断丝连,以后会和time独立。特别是在Duration上面。

一、问题的提出

//世界时间
let utc: DateTime<Utc> = Utc::now();       // e.g. `2014-11-28T12:45:59.324310806Z`
// 本地电脑时间
let local: DateTime<Local> = Local::now(); // 2020-03-25T14:59:59.000000780+08:00

但是因Local类时间是跟本地操作系统的,所以如果你从阿里云(上海)到AMAZON云(纽约),那么,这个local也会变化。在程序设计上,如果需要严谨,那么就要设置相应的时区。

这样就有了FixedOffset。

二、FixedOffset

1、UTC -> FixedOffset 转换

// 世界时间与 北京时间的转换
let dt = Utc::now();
let fixed_dt = dt.with_timezone(&FixedOffset::east(8*3600));

在这里插入图片描述
2、相关用法

本文主要探讨一下固定时区的用法:

// 北京时间是东八区
let dt: DateTime<FixedOffset> = FixedOffset::east(8 * 3600).ymd(2020, 3, 25).and_hms(20, 56, 13);
// 这个与LOCAL是一样的
pub fn add_seconds(start_time: DateTime<FixedOffset>, nseconds: i64) -> DateTime<FixedOffset> {
    let end_time = start_time + chrono::Duration::seconds(nseconds);
    end_time
}

关于struct中字段:

pub struct ExchangeTime {
    // night_preopentime: DateTime<Local>, //NightMarket;
    // night_opentime: DateTime<Local>,
    // night_closetime: DateTime<Local>,
    day_preopentime: DateTime<FixedOffset>,  //开盘集合竟价开盘时间
    day_opentime: DateTime<FixedOffset>,     //日盘连续开市时间
    day_preclosetime: DateTime<FixedOffset>, //日盘连续预结束时间-》尾盘集合竞价开始
    day_closetime: DateTime<FixedOffset>,    //日盘收市
    // day_firstphase_starttime: DateTime<Local>, //第一节休息开始时间,只有商品期货才有
    // day_firstphase_endtime: DateTime<Local>,   //第一节休息结束时间,只有商品期货才有
    day_break_starttime: DateTime<FixedOffset>, //上午休市开始
    day_break_endtime: DateTime<FixedOffset>,   //上午休市结束 }

其它用法:如xtp中md中的data_time.

pub fn get_datetime(ntime: i64) -> DateTime<FixedOffset> {
    // 2020,0321,221327,000
    //println!("ntime:{:?}", ntime);

    let value = ntime as f64;
    let f_year = value / 10.0_f64.powi(13);
    let f_year_left = value - f_year.floor() * 10.0_f64.powi(13);

    // 03,21221327000
    let f_month = f_year_left / 10.0_f64.powi(11);
    // 21,221327000
    let f_month_left = f_year_left - f_month.floor() * 10.0_f64.powi(11);

    let f_day = f_month_left / 10.0_f64.powi(9);
    let f_day_left = f_month_left - f_day.floor() * 10.0_f64.powi(9);

    // 22,1327000
    let f_hour = f_day_left / 10.0_f64.powi(7);
    let f_hour_left = f_day_left - f_hour.floor() * 10.0_f64.powi(7);

    // 13,27000
    let f_minute = f_hour_left / 10.0_f64.powi(5);
    let f_minute_left = f_hour_left - f_minute.floor() * 10.0_f64.powi(5);

    //27000
    let f_second = f_minute_left / 10.0_f64.powi(3);
    let f_second_left = f_minute_left - f_second.floor() * 10.0_f64.powi(3);
    let f_nano = f_second_left;

    //println!("a");
    let y = f_year as i32;
    let m = f_month as u32;
    let d = f_day as u32;
    let hh = f_hour as u32;
    let mm = f_minute as u32;
    let ss = f_second as u32;
    let nano = f_nano as u32;
    let dt: DateTime<FixedOffset> = FixedOffset::east(8 * 3600).ymd(y, m, d).and_hms_nano(hh, mm, ss, nano); 
    dt
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值