相关的库:
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
}