commit 74aef6852cf010d545291fb58b352ad0f8af7348 Author: Jonathan Strong Date: Wed Mar 25 22:17:15 2020 -0400 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9868bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +*.swp diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..4384f93 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,168 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", + "time", +] + +[[package]] +name = "clap" +version = "2.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "hermit-abi" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "redox_syscall" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "time" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +dependencies = [ + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + +[[package]] +name = "utcnow" +version = "1.0.0" +dependencies = [ + "chrono", + "clap", + "libc", +] + +[[package]] +name = "vec_map" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4e36fe6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "utcnow" +version = "1.0.0" +authors = ["Jonathan Strong "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = "0.4" +clap = "2" +libc = "0.2.68" diff --git a/README.md b/README.md new file mode 100644 index 0000000..17536ac --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +``` +utcnow 1.0.0 +Jonathan Strong + +current time in utc with non-cryptic interface. + +for your own safety and well-being, local time functionality is not provided. + +default output format is rfc3339 with trailing 'Z', e.g. '1999-12-31T23:59:59.999999999Z' + +USAGE: + utcnow [FLAGS] + +FLAGS: + -h, --help help + -r, --rfc2822 display in rfc2822 format + -s, --seconds display unix timestamp in seconds, instead of default nanoseconds + -t, --timespec display as , + -u, --unix display elapsed nanoseconds since 1970-01-01T00:00:00Z + -V, --version version +``` diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..23ae768 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,80 @@ +#![allow(unused)] + +use chrono::{DateTime, Utc, NaiveDateTime}; + +fn nanos(utc: DateTime) -> u64 { + (utc.timestamp() as u64) * 1_000_000_000_u64 + (utc.timestamp_subsec_nanos() as u64) +} + +fn get_time() -> (i64, i32) { + let mut tv = libc::timespec { tv_sec: 0, tv_nsec: 0 }; + unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, &mut tv); } + (tv.tv_sec as i64, tv.tv_nsec as i32) +} + +fn timespec_to_utc(sec: i64, nsec: i32) -> DateTime { + let naive = NaiveDateTime::from_timestamp(sec, nsec as u32); + DateTime::from_utc(naive, Utc) +} + +fn timespec_to_nanos(sec: i64, nsec: i32) -> u64 { + (sec as u64) * 1_000_000_000_u64 + (nsec as u64) +} + +fn main() { + let args: clap::ArgMatches = clap::App::new("utcnow") + .author("Jonathan Strong ") + .version(clap::crate_version!()) + .about("\ncurrent time in utc with non-cryptic interface.\n\n\ + for your own safety and well-being, local time functionality is not provided.\n\n\ + default output format is rfc3339 with trailing 'Z', e.g. '1999-12-31T23:59:59.999999999Z'") + .help_message("help") + .version_message("version") + .arg(clap::Arg::with_name("unix") + .help("display elapsed nanoseconds since 1970-01-01T00:00:00Z") + .long("unix") + .short("u") + .required(false) + .takes_value(false)) + .arg(clap::Arg::with_name("rfc2822") + .help("display in rfc2822 format") + .long("rfc2822") + .short("r") + .required(false) + .takes_value(false)) + .arg(clap::Arg::with_name("seconds") + .help("display unix timestamp in seconds, instead of default nanoseconds") + .long("seconds") + .short("s") + .requires("unix") + .required(false) + .takes_value(false)) + .arg(clap::Arg::with_name("timespec") + .help("display as ,") + .long("timespec") + .short("t") + .required(false) + .takes_value(false)) + .get_matches(); + + let (sec, nsec) = get_time(); + + if args.is_present("timespec") { + println!("{},{}", sec, nsec); + } else if args.is_present("unix") { + if args.is_present("seconds") { + println!("{}", sec); + } else { + println!("{}", timespec_to_nanos(sec, nsec)); + } + } else if args.is_present("rfc2822") { + + println!("{}", timespec_to_utc(sec, nsec).to_rfc2822()); + + } else { + // Debug view is iso format / rfc3339 that we want + // Display has spaces - no go + // to_rfc3339 uses +00:00 instead of Z, which I don't like + println!("{:?}", timespec_to_utc(sec, nsec)); + } +}