开发者

Getting current time of a different timezone using C++

How do i get the current time of a different time zone? Example, i need to know the current time in Singapore where as my system is set开发者_StackOverflow中文版 to PT time.


New answer for a very old question.

Given a C++11 or C++14 compiler, and this timezone library, the current time in Singapore is:

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace std::chrono;
    std::cout << date::make_zoned("Asia/Singapore", system_clock::now()) << '\n';
}

which just output for me:

2015-08-19 05:25:05.453824 SGT

This gives the current local date, time and abbreviation in use. And it is based off of the <chrono> library and the IANA timezone database.

std::chrono::system_clock::now() returns a time stamp in the UTC timezone. This program locates the timezone information for "Asia/Singapore", and translates the UTC timestamp into a pair representing the local time and the current timezone for that location.

The above program is independent of the computer's current timezone.

C++20 Update

In C++20 you can now do this (once your vendor ships it):

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    std::cout << zoned_time{"Asia/Singapore", system_clock::now()} << '\n';
}

Output:

2015-08-19 05:25:05.453824 SGT


One implementation would be to use time to get the current time in UTC and then manipulate the TZ environment variable to your destination timezone. Then use localtime_r to convert to that timezone's local time.


Use UTC (GMT) as much as possible.

If you need to (for example) print a report that's going to another time zone, use something like SystemTimeToTzSpecificLocalTime() to localise it.


You could convert to GMT then convert to whatever time zone you want.


C++20 standart

List of timezones can find here - www.zeitverschiebung.net

String date format like %a %b %e %H:%M:%S %Z %Y, here - en.cppreference.com

If you need accuracy in seconds, etc, change minutes in std::chrono::floor<std::chrono::minutes> to the required value.

std::string date = std::format("{:%a %b %e %H:%M:%S %Z %Y}",
                    std::chrono::zoned_time{ "Asia/Singapore",
                        std::chrono::floor<std::chrono::minutes>(
                            std::chrono::system_clock::now())
                    });

Also you can use std::vformat

std::string epoch2StrTZ(const time_t epoch, const std::string& date_format)
{
    std::string date = std::vformat("{:" + date_format + "}", std::make_format_args(
        std::chrono::zoned_time{ "Asia/Singapore",
            std::chrono::floor<std::chrono::minutes>(
                std::chrono::time_point<std::chrono::system_clock>(
                    std::chrono::seconds(epoch)
                )
            )
        }));

    return date;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜