diff --git a/Cargo.toml b/Cargo.toml index fba836e..1d42630 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "utcnow" -version = "1.1.0" +version = "1.2.0" authors = ["Jonathan Strong "] edition = "2018" diff --git a/src/main.rs b/src/main.rs index 394519a..3309028 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ #![allow(unused)] use std::str::FromStr; -use chrono::{DateTime, Utc, NaiveDateTime}; +use chrono::{DateTime, Utc, NaiveDateTime, TimeZone}; const ONE_SECOND: u64 = 1_000_000_000_u64; @@ -68,18 +68,26 @@ fn main() { .help("terminate displayed time with null character instead of newline") .takes_value(false) .required(false)) - .arg(clap::Arg::with_name("unix-to-utc") - .long("unix-to-utc") - .help("convert integer unix timestamp (nanoseconds precision) to iso datetime") + .arg(clap::Arg::with_name("unix-to-rfc3339") + .long("unix-to-rfc3339") + .alias("unix-to-utc") + .help("convert integer unix timestamp (nanoseconds precision) to datetime in rfc3339 format") .takes_value(true) .required(false) .conflicts_with_all(&["unix", "seconds"])) + .arg(clap::Arg::with_name("rfc3339-to-unix") + .long("rfc3339-to-unix") + .alias("utc-to-unix") + .help("parse rfc3339 timestamp and display it as a unix timestamp") + .takes_value(true) + .required(false) + .conflicts_with_all(&["unix", "unix-to-rfc3339", "rfc2822", "timespec"])) .get_matches(); let (sec, nsec): (i64, i32) = - if let Some(ts_str) = args.value_of("unix-to-utc") { // either parse --unix-to-utc input + if let Some(ts_str) = args.value_of("unix-to-rfc3339") { // either parse --unix-to-rfc3339 input match u64::from_str(ts_str) { Ok(nanos) => nanos_to_timespec(nanos), @@ -88,6 +96,18 @@ fn main() { std::process::exit(1); } } + + } else if let Some(rfc_str) = args.value_of("rfc3339-to-unix") { // or --rfc3339-to-unix + //match DateTime::::parse_from_rfc3339(rfc_str) { + match rfc_str.parse::>() { + Ok(utc) => nanos_to_timespec(nanos(utc)), + + Err(e) => { + eprintln!("failed to parse timestamp (expected integer): {}", e); + std::process::exit(1); + } + } + } else { // or else get current time get_time() }; @@ -100,7 +120,7 @@ fn main() { print!("{},{}{}", sec, nsec, endline); - } else if args.is_present("unix") { // display unix + } else if args.is_present("unix") || args.is_present("rfc3339-to-unix") { // display unix if args.is_present("seconds") { // unix seconds print!("{}{}", sec, endline);