[libcxx-commits] [PATCH] D154865: [libc++][format] Fixes times before epoch.
Mark de Wever via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Jul 15 03:03:06 PDT 2023
Mordante updated this revision to Diff 540666.
Mordante added a comment.
Rebased to test CI.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D154865/new/
https://reviews.llvm.org/D154865
Files:
libcxx/include/__chrono/convert_to_tm.h
libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp
libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp
libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp
Index: libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp
===================================================================
--- libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp
+++ libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp
@@ -42,10 +42,23 @@
std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
// Non localized output
+
+ check(SV("1425-08-04 22:06:56"), SV("{}"), std::chrono::sys_seconds(-17'179'869'184s)); // 35 bit minimum
+ check(SV("1901-12-13 20:45:52"), SV("{}"), std::chrono::sys_seconds(-2'147'483'648s));
+
+ check(SV("1969-12-31 00:00:00"), SV("{}"), std::chrono::sys_seconds(-24h));
+ check(SV("1969-12-31 06:00:00"), SV("{}"), std::chrono::sys_seconds(-18h));
+ check(SV("1969-12-31 12:00:00"), SV("{}"), std::chrono::sys_seconds(-12h));
+ check(SV("1969-12-31 18:00:00"), SV("{}"), std::chrono::sys_seconds(-6h));
+ check(SV("1969-12-31 23:59:59"), SV("{}"), std::chrono::sys_seconds(-1s));
+
check(SV("1970-01-01 00:00:00"), SV("{}"), std::chrono::sys_seconds(0s));
check(SV("2000-01-01 00:00:00"), SV("{}"), std::chrono::sys_seconds(946'684'800s));
check(SV("2000-01-01 01:02:03"), SV("{}"), std::chrono::sys_seconds(946'688'523s));
+ check(SV("2038-01-19 03:14:07"), SV("{}"), std::chrono::sys_seconds(2'147'483'647s));
+ check(SV("2514-05-30 01:53:03"), SV("{}"), std::chrono::sys_seconds(17'179'869'183s)); // 35 bit maximum
+
check(SV("2000-01-01 01:02:03.123"), SV("{}"), std::chrono::sys_time<std::chrono::milliseconds>(946'688'523'123ms));
std::locale::global(std::locale::classic());
Index: libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp
===================================================================
--- libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp
+++ libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp
@@ -42,10 +42,23 @@
std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
// Non localized output
+
+ check(SV("1425-08-04 22:06:56"), SV("{}"), std::chrono::local_seconds(-17'179'869'184s)); // 35 bit minimum
+ check(SV("1901-12-13 20:45:52"), SV("{}"), std::chrono::local_seconds(-2'147'483'648s));
+
+ check(SV("1969-12-31 00:00:00"), SV("{}"), std::chrono::local_seconds(-24h));
+ check(SV("1969-12-31 06:00:00"), SV("{}"), std::chrono::local_seconds(-18h));
+ check(SV("1969-12-31 12:00:00"), SV("{}"), std::chrono::local_seconds(-12h));
+ check(SV("1969-12-31 18:00:00"), SV("{}"), std::chrono::local_seconds(-6h));
+ check(SV("1969-12-31 23:59:59"), SV("{}"), std::chrono::local_seconds(-1s));
+
check(SV("1970-01-01 00:00:00"), SV("{}"), std::chrono::local_seconds(0s));
check(SV("2000-01-01 00:00:00"), SV("{}"), std::chrono::local_seconds(946'684'800s));
check(SV("2000-01-01 01:02:03"), SV("{}"), std::chrono::local_seconds(946'688'523s));
+ check(SV("2038-01-19 03:14:07"), SV("{}"), std::chrono::local_seconds(2'147'483'647s));
+ check(SV("2514-05-30 01:53:03"), SV("{}"), std::chrono::local_seconds(17'179'869'183s)); // 35 bit maximum
+
check(SV("2000-01-01 01:02:03.123"), SV("{}"), std::chrono::local_time<std::chrono::milliseconds>(946'688'523'123ms));
std::locale::global(std::locale::classic());
Index: libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp
===================================================================
--- libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp
+++ libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp
@@ -49,10 +49,23 @@
std::locale::global(std::locale(LOCALE_fr_FR_UTF_8));
// Non localized output
+
+ check(SV("1425-08-04 22:06:56"), SV("{}"), file_seconds(-17'179'869'184s)); // 35 bit minimum
+ check(SV("1901-12-13 20:45:52"), SV("{}"), file_seconds(-2'147'483'648s));
+
+ check(SV("1969-12-31 00:00:00"), SV("{}"), file_seconds(-24h));
+ check(SV("1969-12-31 06:00:00"), SV("{}"), file_seconds(-18h));
+ check(SV("1969-12-31 12:00:00"), SV("{}"), file_seconds(-12h));
+ check(SV("1969-12-31 18:00:00"), SV("{}"), file_seconds(-6h));
+ check(SV("1969-12-31 23:59:59"), SV("{}"), file_seconds(-1s));
+
check(SV("1970-01-01 00:00:00"), SV("{}"), file_seconds(0s));
check(SV("2000-01-01 00:00:00"), SV("{}"), file_seconds(946'684'800s));
check(SV("2000-01-01 01:02:03"), SV("{}"), file_seconds(946'688'523s));
+ check(SV("2038-01-19 03:14:07"), SV("{}"), file_seconds(2'147'483'647s));
+ check(SV("2514-05-30 01:53:03"), SV("{}"), file_seconds(17'179'869'183s)); // 35 bit maximum
+
check(SV("2000-01-01 01:02:03.123"), SV("{}"), file_time<std::chrono::milliseconds>(946'688'523'123ms));
std::locale::global(std::locale::classic());
Index: libcxx/include/__chrono/convert_to_tm.h
===================================================================
--- libcxx/include/__chrono/convert_to_tm.h
+++ libcxx/include/__chrono/convert_to_tm.h
@@ -78,7 +78,7 @@
template <class _Tm, class _Duration>
_LIBCPP_HIDE_FROM_ABI _Tm __convert_to_tm(const chrono::sys_time<_Duration> __tp) {
- chrono::sys_days __days = chrono::time_point_cast<chrono::days>(__tp);
+ chrono::sys_days __days = chrono::floor<chrono::days>(__tp);
chrono::year_month_day __ymd{__days};
_Tm __result = std::__convert_to_tm<_Tm>(chrono::year_month_day{__ymd}, chrono::weekday{__days});
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D154865.540666.patch
Type: text/x-patch
Size: 5257 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20230715/ab81ebcc/attachment-0001.bin>
More information about the libcxx-commits
mailing list