Skip to content

Commit

Permalink
fix DST setting properly in UtcTime
Browse files Browse the repository at this point in the history
Fixes #132

Signed-off-by: Bala.FA <[email protected]>
  • Loading branch information
balamurugana committed Apr 11, 2024
1 parent f5132e0 commit c2f2120
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 5 deletions.
1 change: 1 addition & 0 deletions include/miniocpp/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class UtcTime {

static std::tm auxLocaltime(const std::time_t& time);
std::tm getBrokenDownTime() const { return auxLocaltime(secs_); }
static std::time_t toUtcSeconds(const std::time_t time);

public:
UtcTime() = default;
Expand Down
15 changes: 10 additions & 5 deletions src/utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -333,20 +333,25 @@ std::tm UtcTime::auxLocaltime(const std::time_t& time) {
return result;
}

std::time_t UtcTime::toUtcSeconds(const std::time_t secs_local) {
std::tm result{};
gmtime_r(&secs_local, &result);
result.tm_isdst = -1;
return std::mktime(&result);
}

UtcTime UtcTime::Now() {
auto usec_now = std::chrono::system_clock::now().time_since_epoch() /
std::chrono::microseconds(1);
auto secs_local = static_cast<time_t>(usec_now / 1000000);
auto secs_utc = std::mktime(std::gmtime(&secs_local));
return UtcTime(secs_utc, static_cast<long>(usec_now % 1000000));
return UtcTime(toUtcSeconds(static_cast<time_t>(usec_now / 1000000)),
static_cast<long>(usec_now % 1000000));
}

void UtcTime::ToLocalTime(std::tm& time) {
auto usec_now = std::chrono::system_clock::now().time_since_epoch() /
std::chrono::microseconds(1);
auto secs_local = static_cast<time_t>(usec_now / 1000000);
auto secs_utc = std::mktime(std::gmtime(&secs_local));
auto secs = secs_ + (secs_local - secs_utc);
auto secs = secs_ + (secs_local - toUtcSeconds(secs_local));
time = auxLocaltime(secs);
}

Expand Down

0 comments on commit c2f2120

Please sign in to comment.