[libcxx-dev] Possible bug in std::get_time and std::chrono::system_clock::from_time_t

Jonas Nilsson via libcxx-dev libcxx-dev at lists.llvm.org
Thu Nov 21 07:02:11 PST 2019


I find it slightly weird that a seemingly unrelated code change makes this work or not work on my machine. Regardless, you are entirely correct as to the root cause of the problem. Thanks for the help!

/Jonas

> 21 nov. 2019 kl. 15:30 skrev Hans Wennborg <hans at chromium.org>:
> 
> I'm not able to reproduce your exact result with different values
> printed by the two statements, but I do get different results
> depending on whether I build with -O2 or not :-)
> 
> I think the problem is hinted at by this note on
> https://en.cppreference.com/w/cpp/io/manip/get_time
> "Note: tm_isdst is not written to, and needs to be set explicitly for
> use with functions such as mktime"
> 
> With that fixed, the program seems to work as expected:
> 
> #include <chrono>
> #include <iomanip>
> #include <iostream>
> #include <sstream>
> 
> auto stringToTime(std::string const & TimeString) {
>  std::tm t;
>  std::istringstream InSS(TimeString);
>  InSS >> std::get_time(&t, "%Y-%m-%d %T");
>  t.tm_isdst = -1; // <---- Fix here.
>  auto Temp = std::mktime(&t);
>  std::cout << "Temp: " << Temp << std::endl;
>  return std::chrono::system_clock::from_time_t(Temp);
> }
> int main() {
>  stringToTime("1996-02-25 12:13:13");
>  stringToTime("1996-02-25 12:13:13");
>  return 0;
> }
> 
> 
> On Thu, Nov 21, 2019 at 2:50 PM Jonas Nilsson via libcxx-dev
> <libcxx-dev at lists.llvm.org> wrote:
>> 
>> Hi,
>> 
>> I have a problem that I was unable to find anything on in LLVM Bugzilla. Consider this code:
>> 
>> auto stringToTime(std::string const & TimeString) {
>>  std::tm t;
>>  std::istringstream InSS(TimeString);
>>  InSS >> std::get_time(&t, "%Y-%m-%d %T");
>>  auto Temp = std::mktime(&t);
>>  std::cout << "Temp: " << Temp << std::endl;
>>  return std::chrono::system_clock::from_time_t(Temp);
>> }
>> int main() {
>>  stringToTime("1996-02-25 12:13:13");
>>  stringToTime("1996-02-25 12:13:13”);
>>  return 0;
>> }
>> 
>> It produces the following output:
>> Temp: 825243193
>> Temp: 825246793
>> 
>> The last timestamp is correct whereas the first timestamp is off by one hour (3600s).
>> 
>> Removing the last line ("return std::chrono::system_clock::from_time_t(Temp);”) makes the two output lines identical (and correct).
>> 
>> I am using MacOSX Mojave 10.14.6 as a development OS. The compiler version string is: "Apple LLVM version 10.0.1 (clang-1001.0.46.4)”. The region (in System preferences) is set to Sweden.
>> 
>> Is this a known issue?
>> 
>> /Jonas
>> _______________________________________________
>> libcxx-dev mailing list
>> libcxx-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev



More information about the libcxx-dev mailing list