You've already forked parse_datetime
mirror of
https://github.com/uutils/parse_datetime.git
synced 2026-06-10 16:13:15 -07:00
Merge pull request #255 from ChrisDryden/fix-tz-prefix-with-base-date
fix: TZ prefix should override base date timezone
This commit is contained in:
@@ -187,9 +187,13 @@ impl DateTimeBuilder {
|
||||
/// - e. Apply final fixed offset if present.
|
||||
pub(super) fn build(self) -> Result<Zoned, error::Error> {
|
||||
// 1. Choose the base instant.
|
||||
let base = match (self.base, &self.timezone) {
|
||||
(Some(b), _) => b,
|
||||
(None, Some(tz)) => jiff::Timestamp::now().to_zoned(tz.clone()),
|
||||
// If a TZ="..." prefix was parsed, it should override the base's timezone
|
||||
// while keeping the base's timestamp for relative date calculations.
|
||||
let has_timezone = self.timezone.is_some();
|
||||
let base = match (self.base, self.timezone) {
|
||||
(Some(b), Some(tz)) => b.timestamp().to_zoned(tz),
|
||||
(Some(b), None) => b,
|
||||
(None, Some(tz)) => jiff::Timestamp::now().to_zoned(tz),
|
||||
(None, None) => Zoned::now(),
|
||||
};
|
||||
|
||||
@@ -204,7 +208,7 @@ impl DateTimeBuilder {
|
||||
|| self.time.is_some()
|
||||
|| self.weekday.is_some()
|
||||
|| self.offset.is_some()
|
||||
|| self.timezone.is_some();
|
||||
|| has_timezone;
|
||||
|
||||
let mut dt = if need_midnight {
|
||||
base.with().time(civil::time(0, 0, 0, 0)).build()?
|
||||
|
||||
@@ -95,3 +95,20 @@ fn test_date_omitting_year(#[case] input: &str, #[case] year: u32, #[case] expec
|
||||
.unwrap();
|
||||
check_relative(now, input, expected);
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::tz_prefix_est5("TZ=\"EST5\" 1970-01-01 00:00", "1970-01-01 00:00:00-05:00")]
|
||||
#[case::tz_prefix_pst8("TZ=\"PST8\" 1970-01-01 00:00", "1970-01-01 00:00:00-08:00")]
|
||||
#[case::tz_prefix_utc("TZ=\"UTC\" 1970-01-01 12:00", "1970-01-01 12:00:00+00:00")]
|
||||
#[case::tz_prefix_europe_paris(
|
||||
r#"TZ="Europe/Paris" 2025-01-02 03:04:05"#,
|
||||
"2025-01-02 03:04:05+01:00"
|
||||
)]
|
||||
fn test_tz_prefix_with_base_date(#[case] input: &str, #[case] expected: &str) {
|
||||
let base = "2020-06-15 12:00:00"
|
||||
.parse::<DateTime>()
|
||||
.unwrap()
|
||||
.to_zoned(TimeZone::UTC)
|
||||
.unwrap();
|
||||
check_relative(base, input, expected);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user