I am getting an input date from user and convert it into tm struct, (setting is_dst, timezone and gmtoff parameters of tm struct using local time), but when I am using mkTime to get epoch value it changes the timezone and gmtOffset property of tm struct and return the wrong offset value.
tm tmStartDateTime = {};
string dateString = inputDate;
if (myclass::tryParseString(inputDate, "%Y/%m/%d %H:%M:%S", tmStartDateTime))// converting string date to tm
{
struct timespec now = {0};
clock_gettime(CLOCK_REALTIME, &now);
tm *nowStruct = localtime(&now.tv_sec);
// setting isdst, gmtoff and timezone using localtime
tmStartDateTime.tm_isdst = nowStruct->tm_isdst;
tmStartDateTime.tm_gmtoff = nowStruct->tm_gmtoff;
tmStartDateTime.tm_zone = nowStruct->tm_zone;
tm bmStartDate = {};
bmStartDate = tmStartDateTime;
StartDateTimeEpoch = mktime(&bmStartDate);
}
for e.g. if user gives a date 01/01/1970 00:00:00 and machine timezone is set to Europe/London, then tm struct gmtoffset value changes to 3600 and timezone changes to BST whereas the machine timezone is GMT with 0 gmtoffset as daylight saving is ended on 30th oct 2022. Why and How mktime is changing timezone and gmtoffset value of tm struct. (Note: TZ variable of machine is set to empty string, i have also change that to Europe/London but with no luck)
localtime()
is using the DST setting for the time you passed to it, not the current time when the function is called. DST was in effect in the UK on 1 Jan 1970, so it will return summer time regardless of whether DST is in effect today.