Conversion of date from human-readable format to epoch fails

I’d like to create a program that converts the date of a specific human-readable format to epoch.

So far I have the following code the first part of which creates this human-readable format and the second one converts it to epoch.

#include <time.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstring>

using namespace std;

int main(int argc, char const *argv[])
{
     time_t timeNow;
     struct tm *ltm = NULL;
     time(&timeNow);
     ltm = localtime(&timeNow);
     char buffer[100];
     strftime(buffer, sizeof(buffer), "%c %Z", ltm);
     cout << "human readable timestamp  is " << buffer << endl;
     std::tm tmNow;
     memset(&tmNow, 0, sizeof(tmNow));
     strptime(buffer, "%c %Z", &tmNow);
     cout << "epoch timestamp  is " <<  mktime(&tmNow) << endl;
     return 0;
}

So the printouts I get are the following :

human readable timestamp is Thu Sep 16 10:23:06 2021 EEST
epoch timestamp  is 1631780586

My time zone is EEST as one can see but the epoch one is wrong because it is one hour ahead. The correct should have been 1631776986. I assume I’m doing wrong something with the local time. I’ve found third-party libraries examples like boost or poco that do this conversion, but I’d prefer the above conversion to be done by using native C++.
Does anyone see what I’m missing?

Answer

The C timing/calendrical API is very difficult to use correctly (which is why C++ is moving away from it).

From the C standard:

The value of tm_isdst is positive if Daylight Saving Time is in effect, zero if Daylight Saving Time is not in effect, and negative if the information is not available.

Set tmNow.tm_isdst = -1; prior to the call to mktime.