Skip to content

Commit 6b0a10f

Browse files
committed
support millisecond timestamp & float second timestamp
1 parent 3d499ee commit 6b0a10f

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

src/moment/date_time.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use chrono::prelude::*;
21
use crate::moment::{date, time};
2+
use chrono::prelude::*;
33
use itertools::Itertools;
44

55
pub fn parse(s: &str) -> Option<Vec<DateTime<Local>>> {

src/moment/timestamp.rs

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,44 @@
11
use chrono::prelude::*;
22

33
pub fn parse(s: &str) -> Option<Vec<DateTime<Local>>> {
4+
type TryTimestamp = fn(&str) -> Option<DateTime<Local>>;
5+
let parses: Vec<TryTimestamp> = vec![parse_sec, parse_ms, parse_float_sec];
6+
for p in parses {
7+
if let Some(t) = p(s) {
8+
return Some(vec![t]);
9+
}
10+
}
11+
None
12+
}
13+
14+
fn parse_sec(s: &str) -> Option<DateTime<Local>> {
415
let sec = s.parse().ok()?;
516
let t = Local.timestamp(sec, 0);
617

718
if 2010 <= t.year() && t.year() <= 2030 {
8-
Some(vec![t])
19+
Some(t)
20+
} else {
21+
None
22+
}
23+
}
24+
25+
fn parse_ms(s: &str) -> Option<DateTime<Local>> {
26+
let ms: i64 = s.parse().ok()?;
27+
let t = Local.timestamp(ms / 1000, ms as u32 % 1000);
28+
29+
if 2010 <= t.year() && t.year() <= 2030 {
30+
Some(t)
31+
} else {
32+
None
33+
}
34+
}
35+
36+
fn parse_float_sec(s: &str) -> Option<DateTime<Local>> {
37+
let sec: f64 = s.parse().ok()?;
38+
let t = Local.timestamp(sec as i64, 0);
39+
40+
if 2010 <= t.year() && t.year() <= 2030 {
41+
Some(t)
942
} else {
1043
None
1144
}

0 commit comments

Comments
 (0)