diff --git a/libcxx/include/__chrono/convert_to_tm.h b/libcxx/include/__chrono/convert_to_tm.h --- a/libcxx/include/__chrono/convert_to_tm.h +++ b/libcxx/include/__chrono/convert_to_tm.h @@ -78,7 +78,7 @@ template _LIBCPP_HIDE_FROM_ABI _Tm __convert_to_tm(const chrono::sys_time<_Duration> __tp) { - chrono::sys_days __days = chrono::time_point_cast(__tp); + chrono::sys_days __days = chrono::floor(__tp); chrono::year_month_day __ymd{__days}; _Tm __result = std::__convert_to_tm<_Tm>(chrono::year_month_day{__ymd}, chrono::weekday{__days}); diff --git a/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp --- a/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.file_time.pass.cpp @@ -49,10 +49,30 @@ std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); // Non localized output + + // [time.syn] + // using nanoseconds = duration; + // using microseconds = duration; + // using milliseconds = duration; + // using seconds = duration; + // using minutes = duration>; + // using hours = duration>; + check(SV("1425-08-04 22:06:56"), SV("{}"), file_seconds(-17'179'869'184s)); // Minimum value for 35 bits. + 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)); // Maximum value for 35 bits. + check(SV("2000-01-01 01:02:03.123"), SV("{}"), file_time(946'688'523'123ms)); std::locale::global(std::locale::classic()); diff --git a/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp --- a/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.local_time.pass.cpp @@ -42,10 +42,31 @@ std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); // Non localized output + + // [time.syn] + // using nanoseconds = duration; + // using microseconds = duration; + // using milliseconds = duration; + // using seconds = duration; + // using minutes = duration>; + // using hours = duration>; + check( + SV("1425-08-04 22:06:56"), SV("{}"), std::chrono::local_seconds(-17'179'869'184s)); // Minimum value for 35 bits. + 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)); // Maximum value for 35 bits. + check(SV("2000-01-01 01:02:03.123"), SV("{}"), std::chrono::local_time(946'688'523'123ms)); std::locale::global(std::locale::classic()); diff --git a/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp b/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp --- a/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp +++ b/libcxx/test/std/time/time.syn/formatter.sys_time.pass.cpp @@ -42,10 +42,30 @@ std::locale::global(std::locale(LOCALE_fr_FR_UTF_8)); // Non localized output + + // [time.syn] + // using nanoseconds = duration; + // using microseconds = duration; + // using milliseconds = duration; + // using seconds = duration; + // using minutes = duration>; + // using hours = duration>; + check(SV("1425-08-04 22:06:56"), SV("{}"), std::chrono::sys_seconds(-17'179'869'184s)); // Minimum value for 35 bits. + 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)); // Maximum value for 35 bits. + check(SV("2000-01-01 01:02:03.123"), SV("{}"), std::chrono::sys_time(946'688'523'123ms)); std::locale::global(std::locale::classic());