mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-29 12:07:46 +00:00
Merge pull request #7134 from jfinkels/date-timezone-name
date: display %Z alphabetic time zone abbreviation
This commit is contained in:
commit
c322fb5c73
5 changed files with 65 additions and 9 deletions
33
Cargo.lock
generated
33
Cargo.lock
generated
|
@ -302,6 +302,28 @@ dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chrono-tz"
|
||||||
|
version = "0.8.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"chrono-tz-build",
|
||||||
|
"phf",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chrono-tz-build"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f"
|
||||||
|
dependencies = [
|
||||||
|
"parse-zoneinfo",
|
||||||
|
"phf",
|
||||||
|
"phf_codegen",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clang-sys"
|
name = "clang-sys"
|
||||||
version = "1.8.1"
|
version = "1.8.1"
|
||||||
|
@ -1582,6 +1604,15 @@ dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parse-zoneinfo"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
|
||||||
|
dependencies = [
|
||||||
|
"regex",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parse_datetime"
|
name = "parse_datetime"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
@ -2579,7 +2610,9 @@ name = "uu_date"
|
||||||
version = "0.0.29"
|
version = "0.0.29"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"chrono-tz",
|
||||||
"clap",
|
"clap",
|
||||||
|
"iana-time-zone",
|
||||||
"libc",
|
"libc",
|
||||||
"parse_datetime",
|
"parse_datetime",
|
||||||
"uucore",
|
"uucore",
|
||||||
|
|
|
@ -280,6 +280,8 @@ chrono = { version = "0.4.38", default-features = false, features = [
|
||||||
] }
|
] }
|
||||||
clap = { version = "4.5", features = ["wrap_help", "cargo"] }
|
clap = { version = "4.5", features = ["wrap_help", "cargo"] }
|
||||||
clap_complete = "4.4"
|
clap_complete = "4.4"
|
||||||
|
chrono-tz = "0.8.3"
|
||||||
|
iana-time-zone = "0.1.57"
|
||||||
clap_mangen = "0.2"
|
clap_mangen = "0.2"
|
||||||
compare = "0.1.0"
|
compare = "0.1.0"
|
||||||
coz = { version = "0.1.3" }
|
coz = { version = "0.1.3" }
|
||||||
|
|
|
@ -22,6 +22,8 @@ chrono = { workspace = true }
|
||||||
clap = { workspace = true }
|
clap = { workspace = true }
|
||||||
uucore = { workspace = true }
|
uucore = { workspace = true }
|
||||||
parse_datetime = { workspace = true }
|
parse_datetime = { workspace = true }
|
||||||
|
chrono-tz = { workspace = true }
|
||||||
|
iana-time-zone = { workspace = true }
|
||||||
|
|
||||||
[target.'cfg(unix)'.dependencies]
|
[target.'cfg(unix)'.dependencies]
|
||||||
libc = { workspace = true }
|
libc = { workspace = true }
|
||||||
|
|
|
@ -6,10 +6,12 @@
|
||||||
// spell-checker:ignore (chrono) Datelike Timelike ; (format) DATEFILE MMDDhhmm ; (vars) datetime datetimes
|
// spell-checker:ignore (chrono) Datelike Timelike ; (format) DATEFILE MMDDhhmm ; (vars) datetime datetimes
|
||||||
|
|
||||||
use chrono::format::{Item, StrftimeItems};
|
use chrono::format::{Item, StrftimeItems};
|
||||||
use chrono::{DateTime, FixedOffset, Local, Offset, TimeDelta, Utc};
|
use chrono::{DateTime, FixedOffset, Local, Offset, TimeDelta, TimeZone, Utc};
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
use chrono::{Datelike, Timelike};
|
use chrono::{Datelike, Timelike};
|
||||||
|
use chrono_tz::{OffsetName, Tz};
|
||||||
use clap::{crate_version, Arg, ArgAction, Command};
|
use clap::{crate_version, Arg, ArgAction, Command};
|
||||||
|
use iana_time_zone::get_timezone;
|
||||||
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))]
|
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "redox")))]
|
||||||
use libc::{clock_settime, timespec, CLOCK_REALTIME};
|
use libc::{clock_settime, timespec, CLOCK_REALTIME};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
@ -272,8 +274,21 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
||||||
for date in dates {
|
for date in dates {
|
||||||
match date {
|
match date {
|
||||||
Ok(date) => {
|
Ok(date) => {
|
||||||
|
// TODO - Revisit when chrono 0.5 is released. https://github.com/chronotope/chrono/issues/970
|
||||||
|
let tz = match std::env::var("TZ") {
|
||||||
|
// TODO Support other time zones...
|
||||||
|
Ok(s) if s == "UTC0" => Tz::Etc__UTC,
|
||||||
|
_ => match get_timezone() {
|
||||||
|
Ok(tz_str) => tz_str.parse().unwrap(),
|
||||||
|
Err(_) => Tz::Etc__UTC,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let offset = tz.offset_from_utc_date(&Utc::now().date_naive());
|
||||||
|
let tz_abbreviation = offset.abbreviation();
|
||||||
// GNU `date` uses `%N` for nano seconds, however crate::chrono uses `%f`
|
// GNU `date` uses `%N` for nano seconds, however crate::chrono uses `%f`
|
||||||
let format_string = &format_string.replace("%N", "%f");
|
let format_string = &format_string
|
||||||
|
.replace("%N", "%f")
|
||||||
|
.replace("%Z", tz_abbreviation);
|
||||||
// Refuse to pass this string to chrono as it is crashing in this crate
|
// Refuse to pass this string to chrono as it is crashing in this crate
|
||||||
if format_string.contains("%#z") {
|
if format_string.contains("%#z") {
|
||||||
return Err(USimpleError::new(
|
return Err(USimpleError::new(
|
||||||
|
@ -403,7 +418,7 @@ fn make_format_string(settings: &Settings) -> &str {
|
||||||
Rfc3339Format::Ns => "%F %T.%f%:z",
|
Rfc3339Format::Ns => "%F %T.%f%:z",
|
||||||
},
|
},
|
||||||
Format::Custom(ref fmt) => fmt,
|
Format::Custom(ref fmt) => fmt,
|
||||||
Format::Default => "%c",
|
Format::Default => "%a %b %e %X %Z %Y",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,11 +144,12 @@ fn test_date_utc() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_date_utc_issue_6495() {
|
fn test_date_utc_issue_6495() {
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
.env("TZ", "UTC0")
|
||||||
.arg("-u")
|
.arg("-u")
|
||||||
.arg("-d")
|
.arg("-d")
|
||||||
.arg("@0")
|
.arg("@0")
|
||||||
.succeeds()
|
.succeeds()
|
||||||
.stdout_is("Thu Jan 1 00:00:00 1970\n");
|
.stdout_is("Thu Jan 1 00:00:00 UTC 1970\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -423,16 +424,18 @@ fn test_invalid_date_string() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_date_one_digit_date() {
|
fn test_date_one_digit_date() {
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
.env("TZ", "UTC0")
|
||||||
.arg("-d")
|
.arg("-d")
|
||||||
.arg("2000-1-1")
|
.arg("2000-1-1")
|
||||||
.succeeds()
|
.succeeds()
|
||||||
.stdout_contains("Sat Jan 1 00:00:00 2000");
|
.stdout_only("Sat Jan 1 00:00:00 UTC 2000\n");
|
||||||
|
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
.env("TZ", "UTC0")
|
||||||
.arg("-d")
|
.arg("-d")
|
||||||
.arg("2000-1-4")
|
.arg("2000-1-4")
|
||||||
.succeeds()
|
.succeeds()
|
||||||
.stdout_contains("Tue Jan 4 00:00:00 2000");
|
.stdout_only("Tue Jan 4 00:00:00 UTC 2000\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -464,6 +467,7 @@ fn test_date_parse_from_format() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_date_from_stdin() {
|
fn test_date_from_stdin() {
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
.env("TZ", "UTC0")
|
||||||
.arg("-f")
|
.arg("-f")
|
||||||
.arg("-")
|
.arg("-")
|
||||||
.pipe_in(
|
.pipe_in(
|
||||||
|
@ -473,8 +477,8 @@ fn test_date_from_stdin() {
|
||||||
)
|
)
|
||||||
.succeeds()
|
.succeeds()
|
||||||
.stdout_is(
|
.stdout_is(
|
||||||
"Mon Mar 27 08:30:00 2023\n\
|
"Mon Mar 27 08:30:00 UTC 2023\n\
|
||||||
Sat Apr 1 12:00:00 2023\n\
|
Sat Apr 1 12:00:00 UTC 2023\n\
|
||||||
Sat Apr 15 18:30:00 2023\n",
|
Sat Apr 15 18:30:00 UTC 2023\n",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue