diff --git a/test/test_utils.py b/test/test_utils.py index fceca03ec0..c7e3335222 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -421,6 +421,10 @@ def test_unified_timestamps(self): self.assertEqual(unified_timestamp('Wednesday 31 December 1969 18:01:26 MDT'), 86) self.assertEqual(unified_timestamp('12/31/1969 20:01:18 EDT', False), 78) self.assertEqual(unified_timestamp('2023-03-09T18:01:33.646Z', with_milliseconds=True), 1678384893.646) + # ISO8601 spec says that if no timezone is specified, we should use local timezone; + # but yt-dlp uses UTC to keep things consistent + self.assertEqual(unified_timestamp('2023-03-11T06:48:34.008'), 1678517314) + def test_determine_ext(self): self.assertEqual(determine_ext('http://example.com/foo/bar.mp4/?download'), 'mp4') diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index bc2c362994..3edb7b053b 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -1868,8 +1868,9 @@ def unified_timestamp(date_str, day_first=True, with_milliseconds=False): for expression in date_formats(day_first): with contextlib.suppress(ValueError): - dt = datetime.datetime.strptime(date_str, expression) - timezone + datetime.timedelta(hours=pm_delta) - return calendar.timegm(dt.timetuple()) + (dt.microsecond / 1e6 if with_milliseconds else 0) + dt = datetime.datetime.strptime(date_str, expression) + datetime.timedelta(hours=pm_delta) + dt_tz_aware = dt.replace(tzinfo=datetime.timezone(timezone)) + return dt_tz_aware.timestamp() if with_milliseconds else int(dt_tz_aware.timestamp()) timetuple = email.utils.parsedate_tz(date_str) if timetuple: