注意:没经过任何调试,不清楚会有哪些问题。
有一些多余的代码,到时可自行去除
刚接触rust,代码整体有待改进
使用需谨慎!!!
流程:
1、cargo new MTime;
2、main.rs文件内容如下
use std::{
time::{Duration, Instant, SystemTime, UNIX_EPOCH},
};
fn main() {
let start_time = Instant::now(); //可去除
match MTime::new() {
Ok(v) => {
println!(
"{}:{}:{} {}:{}:{}",
v.year, v.month, v.day, v.hour, v.minute, v.second
);
}
Err(_) => println!("err"),
}
println!("程序耗时:{}微秒", start_time.elapsed().as_micros()); //可去除
}
struct MTime {
year: u64,
month: u64,
day: u64,
hour: u64,
minute: u64,
second: u64,
}
impl MTime {
pub fn new() -> Result<MTime, String> {
match SystemTime::now().duration_since(UNIX_EPOCH) {
Ok(r) => Ok(timestamp_to_time(r)),
Err(_) => Err("err".to_owned()),
}
}
}
fn timestamp_to_time(timestamp: Duration) -> MTime {
let _second: u64 = timestamp.as_secs();
let mut y: u64 = 1970;
let mut m: u64 = 1;
let mut d: u64 = (_second / (24 * 60 * 60)) + 1; //够24小时才会加,所以当天不够24小时并不会加上去。所以需要多加一天才会显示正确
let s: u64 = _second % (24 * 60 * 60) % (60 * 60) % 60;
let minute: u64 = (_second % (24 * 60 * 60)) % (60 * 60) / 60;
let h: u64 = (_second % (24 * 60 * 60)) / (60 * 60) + 8;
// 处理年月日
loop {
if d > 365 {
// 大于365天,则判断年份
if y % 4 == 0 && y % 100 != 0 || y % 400 == 0 {
d -= 366;
} else {
d -= 365;
}
y += 1;
} else {
// 小于365天,则判断月份
if d > 31 {
d -= 31;
m += 1;
if m == 2 {
if y % 4 == 0 && y % 100 != 0 || y % 400 == 0 {
if d > 29 {
d -= 29;
m += 1;
}
} else {
if d > 28 {
d -= 28;
m += 1;
}
}
} else if m == (3 | 5 | 7 | 8 | 10 | 12) {
if d > 31 {
d -= 31;
m += 1;
}
} else {
if d > 30 {
d -= 30;
m += 1;
}
}
} else {
break;
}
// 另一种方法实现
// if d > 31 {
// match Option::Some(m) {
// Some(1) => {d -= 31; m += 1},
// Some(2) => {
// if y % 4 == 0 && y % 100 != 0 || y % 400 == 0 {
// // 闰年
// if d > 29 {
// d -= 29;
// m += 1;
// }
// } else {
// // 平年
// if d > 28 {
// d -= 28;
// m += 1;
// }
// }
// },
// Some(3 | 5 | 7 | 8 | 10 |12) => {
// if d > 31 {
// d -= 31;
// m += 1;
// }
// },
// Some(4 | 6 | 9 | 11) => {
// if d > 30 {
// d -= 30;
// m += 1;
// }
// }
// None => break,
// _ => break,
// }
// } else {
// break;
// }
}
}
MTime {
year: y,
month: m,
day: d,
hour: h,
minute: minute,
second: s,
}
}