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

Hans Wennborg via libcxx-dev libcxx-dev at lists.llvm.org
Thu Nov 21 06:30:35 PST 2019


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