Skip to content

Commit

Permalink
add some display methods
Browse files Browse the repository at this point in the history
  • Loading branch information
zhuxiujia committed Oct 20, 2023
1 parent bc78391 commit ffe19fd
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 63 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "fastdate"
version = "0.3.4"
version = "0.3.5"
edition = "2021"
description = "Rust fast date carte"
readme = "Readme.md"
Expand Down
109 changes: 65 additions & 44 deletions src/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,27 @@ impl DateTime {
}.set_offset(offset)
}


/// stand "0000-00-00 00:00:00.000000000"
pub fn display_stand(&self) -> String {
let mut v =self.display(false);
v.replace_range((10..11)," ");
v
}

/// RFC3339 "0000-00-00T00:00:00.000000000Z"
/// RFC3339 "0000-00-00T00:00:00.000000000+00:00:00"
pub fn display(&self, f: &mut Formatter) -> std::fmt::Result {
pub fn display(&self, zone: bool) -> String {
let mut buf: [u8; 38] = *b"0000-00-00T00:00:00.000000000+00:00:00";
let len = self.do_display(&mut buf, zone);
std::str::from_utf8(&buf[..len]).unwrap().to_string()
}

/// let mut buf: [u8; 38] = *b"0000-00-00T00:00:00.000000000+00:00:00";
/// than print this:
/// RFC3339 "0000-00-00T00:00:00.000000000Z"
/// RFC3339 "0000-00-00T00:00:00.000000000+00:00:00"
pub fn do_display(&self, buf: &mut [u8; 38], add_zone: bool) -> usize {
let year = self.year();
let mon = self.mon();
let day = self.day();
Expand All @@ -320,58 +337,60 @@ impl DateTime {
buf[8] = b'0' + (day / 10);
buf[9] = b'0' + (day % 10);
let time = Time::from(self.clone());
let mut len = time.display_time(11, &mut buf);
let offset = self.offset();
if offset == 0 {
buf[len] = b'Z';
len += 1;
} else {
let (h, m, s) = self.inner.offset().as_hms();
if offset > 0 {
buf[len] = b'+';
len += 1;
buf[len] = b'0' + (h as u8 / 10);
let mut len = time.display_time(11, buf);
if add_zone {
let offset = self.offset();
if offset == 0 {
buf[len] = b'Z';
len += 1;
buf[len] = b'0' + (h as u8 % 10);
len += 1;
buf[len] = b':' + (m as u8 / 10);
len += 1;
buf[len] = b'0' + (m as u8 / 10);
len += 1;
buf[len] = b'0' + (m as u8 % 10);
len += 1;
if s != 0 {
buf[len] = b':' + (s as u8 / 10);
} else {
let (h, m, s) = self.inner.offset().as_hms();
if offset > 0 {
buf[len] = b'+';
len += 1;
buf[len] = b'0' + (s as u8 / 10);
buf[len] = b'0' + (h as u8 / 10);
len += 1;
buf[len] = b'0' + (s as u8 % 10);
buf[len] = b'0' + (h as u8 % 10);
len += 1;
}
} else {
buf[len] = b'-';
len += 1;
buf[len] = b'0' + (-h as u8 / 10);
len += 1;
buf[len] = b'0' + (-h as u8 % 10);
len += 1;
buf[len] = b':' + (-m as u8 / 10);
len += 1;
buf[len] = b'0' + (-m as u8 / 10);
len += 1;
buf[len] = b'0' + (-m as u8 % 10);
len += 1;
if s != 0 {
buf[len] = b':' + (-s as u8 / 10);
buf[len] = b':' + (m as u8 / 10);
len += 1;
buf[len] = b'0' + (m as u8 / 10);
len += 1;
buf[len] = b'0' + (m as u8 % 10);
len += 1;
if s != 0 {
buf[len] = b':' + (s as u8 / 10);
len += 1;
buf[len] = b'0' + (s as u8 / 10);
len += 1;
buf[len] = b'0' + (s as u8 % 10);
len += 1;
}
} else {
buf[len] = b'-';
len += 1;
buf[len] = b'0' + (-h as u8 / 10);
len += 1;
buf[len] = b'0' + (-h as u8 % 10);
len += 1;
buf[len] = b':' + (-m as u8 / 10);
len += 1;
buf[len] = b'0' + (-s as u8 / 10);
buf[len] = b'0' + (-m as u8 / 10);
len += 1;
buf[len] = b'0' + (-s as u8 % 10);
buf[len] = b'0' + (-m as u8 % 10);
len += 1;
if s != 0 {
buf[len] = b':' + (-s as u8 / 10);
len += 1;
buf[len] = b'0' + (-s as u8 / 10);
len += 1;
buf[len] = b'0' + (-s as u8 % 10);
len += 1;
}
}
}
}
f.write_str(std::str::from_utf8(&buf[..len]).unwrap())
len
}
}

Expand Down Expand Up @@ -495,7 +514,9 @@ impl FromStr for DateTime {
impl Display for DateTime {
/// fmt RFC3339Nano = "2006-01-02T15:04:05.999999999"
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
self.display(f)
let mut buf: [u8; 38] = *b"0000-00-00T00:00:00.000000000+00:00:00";
let len = self.do_display(&mut buf, true);
f.write_str(std::str::from_utf8(&buf[..len]).unwrap())
}
}

Expand Down
78 changes: 60 additions & 18 deletions tests/datetime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::time::{Duration, SystemTime};

#[test]
fn test_other_space() {
let d = DateTime::parse("YYYY MM DD hh_mm_ss.000000","1234_12_13_11_12_13.123456").unwrap();
let d = DateTime::parse("YYYY MM DD hh_mm_ss.000000", "1234_12_13_11_12_13.123456").unwrap();
println!("{}", d);
assert_eq!("1234-12-13T11:12:13.123456Z".to_string(), d.to_string());
}
Expand All @@ -13,7 +13,7 @@ fn test_other_space() {
fn test_date() {
let d = DateTime::from_str("1234-12-13 11:12:13.123456").unwrap();
println!("{}", d);
assert_eq!( d.to_string(),"1234-12-13T11:12:13.123456Z".to_string());
assert_eq!(d.to_string(), "1234-12-13T11:12:13.123456Z".to_string());
}

#[test]
Expand All @@ -40,9 +40,9 @@ fn test_date_utc_add() {
#[test]
fn test_offset() {
let utc = DateTime::from_str("2022-12-12T12:12:12.000000+08:00").unwrap();
println!("{}",utc);
println!("{}",utc.offset());
assert_eq!(utc.offset(),28800);
println!("{}", utc);
println!("{}", utc.offset());
assert_eq!(utc.offset(), 28800);
}

#[test]
Expand Down Expand Up @@ -98,11 +98,11 @@ fn test_timestamp_nano() {

#[test]
fn test_date_time() {
let new_time = DateTime::from((Date{
let new_time = DateTime::from((Date {
day: 12,
mon: 12,
year: 2023,
}, Time{
}, Time {
nano: 12,
sec: 12,
minute: 12,
Expand All @@ -113,21 +113,21 @@ fn test_date_time() {

#[test]
fn test_set_offset() {
let new_time = DateTime::from((Date{
let new_time = DateTime::from((Date {
day: 12,
mon: 12,
year: 2023,
}, Time{
}, Time {
nano: 12,
sec: 12,
minute: 12,
hour: 12,
}));
let timestamp_nano = new_time.unix_timestamp_nano();
assert_eq!(new_time.to_string(), "2023-12-12T12:12:12.000000012Z");
let new_time=new_time.set_offset(offset_sec());
let new_time = new_time.set_offset(offset_sec());
assert_eq!(new_time.to_string(), "2023-12-12T20:12:12.000000012+08:00");
assert_eq!(new_time.unix_timestamp_nano(),timestamp_nano);
assert_eq!(new_time.unix_timestamp_nano(), timestamp_nano);
}

#[test]
Expand Down Expand Up @@ -161,7 +161,7 @@ fn test_into() {
let time: Time = utc.clone().into();
assert_eq!("2022-12-12", date.to_string());
assert_eq!("00:00:00", time.to_string());
assert_eq!( utc.offset(),28800);
assert_eq!(utc.offset(), 28800);
}

#[test]
Expand All @@ -182,21 +182,21 @@ fn test_parse_z() {
fn test_parse_z_add() {
let date = DateTime::from_str("2022-12-12 00:00:00.000000+09:00").unwrap();
let date_offset = date.clone();
assert_eq!( date_offset.to_string(),"2022-12-12T00:00:00+09:00");
assert_eq!(date_offset.to_string(), "2022-12-12T00:00:00+09:00");
}

#[test]
fn test_parse_z_sub() {
let date = DateTime::from_str("2022-12-12 00:00:00.000000-09:00").unwrap();
let date_offset = date.clone();
assert_eq!(date_offset.to_string(),"2022-12-12T00:00:00-09:00");
assert_eq!(date_offset.to_string(), "2022-12-12T00:00:00-09:00");
}

#[test]
fn test_set_offset_sub() {
let mut date = DateTime::from_str("2022-12-12 09:00:00").unwrap();
date = date.set_offset(-9 * 3600);
assert_eq!( date.to_string(),"2022-12-12T00:00:00-09:00");
assert_eq!(date.to_string(), "2022-12-12T00:00:00-09:00");
}

#[test]
Expand Down Expand Up @@ -230,7 +230,7 @@ fn test_week() {
fn test_nano() {
let date1 = DateTime::from_str("2019-04-28 00:00:00.023333333").unwrap();
println!("{}", date1.to_string());
assert_eq!( date1.to_string(),"2019-04-28T00:00:00.023333333Z");
assert_eq!(date1.to_string(), "2019-04-28T00:00:00.023333333Z");
}


Expand Down Expand Up @@ -287,7 +287,7 @@ fn test_add_sub_sec() {
#[test]
fn test_1958_unix() {
let date = DateTime::from_str("1958-01-01T00:00:00Z").unwrap();
println!("s={:?},date={}", SystemTime::from(date.clone()), DateTime::from_system_time(SystemTime::from(date.clone()),0));
println!("s={:?},date={}", SystemTime::from(date.clone()), DateTime::from_system_time(SystemTime::from(date.clone()), 0));
assert_eq!(date.unix_timestamp(), -378691200);
}

Expand Down Expand Up @@ -327,4 +327,46 @@ fn test_add() {
let v = epoch + Duration::from_micros(us as u64);
println!("{}", v);//2023-02-14 07:37:40
assert_eq!(v.to_string(), "2021-12-22T10:39:08Z");
}
}

#[test]
fn test_display_date() {
let epoch = fastdate::DateTime::from(Date {
day: 1,
mon: 1,
year: 2000,
});
let v = epoch.display(false);
assert_eq!(v, "2000-01-01T00:00:00");
}

#[test]
fn test_display_datetime() {
let epoch = fastdate::DateTime::from((Date {
day: 1,
mon: 1,
year: 2000,
}, Time {
nano: 1233,
sec: 11,
minute: 1,
hour: 1,
}));
let v = epoch.display(false);
assert_eq!(v, "2000-01-01T01:01:11.000001233");
}
#[test]
fn test_display_stand() {
let epoch = fastdate::DateTime::from((Date {
day: 1,
mon: 1,
year: 2000,
}, Time {
nano: 1233,
sec: 11,
minute: 1,
hour: 1,
}));
let v = epoch.display_stand();
assert_eq!(v, "2000-01-01 01:01:11.000001233");
}

0 comments on commit ffe19fd

Please sign in to comment.