Browse Source

initial commit

tags/v1.0.0
Jonathan Strong 4 years ago
commit
74aef6852c
5 changed files with 283 additions and 0 deletions
  1. +2
    -0
      .gitignore
  2. +168
    -0
      Cargo.lock
  3. +12
    -0
      Cargo.toml
  4. +21
    -0
      README.md
  5. +80
    -0
      src/main.rs

+ 2
- 0
.gitignore View File

@@ -0,0 +1,2 @@
/target
*.swp

+ 168
- 0
Cargo.lock View File

@@ -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"

+ 12
- 0
Cargo.toml View File

@@ -0,0 +1,12 @@
[package]
name = "utcnow"
version = "1.0.0"
authors = ["Jonathan Strong <jonathan.strong@gmail.com>"]
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"

+ 21
- 0
README.md View File

@@ -0,0 +1,21 @@
```
utcnow 1.0.0
Jonathan Strong <jonathan.strong@gmail.com>

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 <sec>,<nsec>
-u, --unix display elapsed nanoseconds since 1970-01-01T00:00:00Z
-V, --version version
```

+ 80
- 0
src/main.rs View File

@@ -0,0 +1,80 @@
#![allow(unused)]

use chrono::{DateTime, Utc, NaiveDateTime};

fn nanos(utc: DateTime<Utc>) -> 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<Utc> {
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 <jonathan.strong@gmail.com>")
.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 <sec>,<nsec>")
.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));
}
}

Loading…
Cancel
Save