Làm cách nào để lấy giá trị UTC hiện tại (như trong múi giờ, nhưng chỉ bù đắp UTC của thời điểm hiện tại)?Tôi làm cách nào để lấy giá trị UTC hiện tại (múi giờ)?
Tôi cần câu trả lời như "+02: 00".
Làm cách nào để lấy giá trị UTC hiện tại (như trong múi giờ, nhưng chỉ bù đắp UTC của thời điểm hiện tại)?Tôi làm cách nào để lấy giá trị UTC hiện tại (múi giờ)?
Tôi cần câu trả lời như "+02: 00".
Có hai phần cho câu hỏi này:
boost::posix_time::time_duration
time_duration
theo quy địnhRõ ràng, nhận múi giờ địa phương là không được hiển thị rất tốt trong một API được triển khai rộng rãi. Chúng ta có thể, tuy nhiên, có được nó bằng cách lấy sự khác biệt của một khoảnh khắc tương đối so với UTC và cùng một thời điểm tương ứng với múi giờ hiện tại, như thế này:
boost::posix_time::time_duration get_utc_offset() {
using namespace boost::posix_time;
// boost::date_time::c_local_adjustor uses the C-API to adjust a
// moment given in utc to the same moment in the local time zone.
typedef boost::date_time::c_local_adjustor<ptime> local_adj;
const ptime utc_now = second_clock::universal_time();
const ptime now = local_adj::utc_to_local(utc_now);
return now - utc_now;
}
định dạng bù đắp theo quy định là chỉ là vấn đề của imbuing quyền time_facet
:
std::string get_utc_offset_string() {
std::stringstream out;
using namespace boost::posix_time;
time_facet* tf = new time_facet();
tf->time_duration_format("%+%H:%M");
out.imbue(std::locale(out.getloc(), tf));
out << get_utc_offset();
return out.str();
}
Bây giờ, get_utc_offset_string()
sẽ mang lại kết quả mong muốn.
Kể từ C++ 11 bạn có thể sử dụng chrono và std::put_time:
#include <chrono>
#include <iomanip>
#include <iostream>
int main()
{
using sc = std::chrono::system_clock;
auto tm = sc::to_time_t(sc::now());
std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n");
std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n");
}
này tạo ra kết quả như sau:
thời gian định dạng: 2018-02-15T10: 25: 27 + 0100
chỉ bù đắp: +0100
Đó là vấn đề phức tạp; một giá trị UTC cụ thể có thể tương ứng với nhiều múi giờ, chẳng hạn. –
@Roger: Vì vậy ... Tôi đoán cách chính xác để nói rằng đó là tôi đang tìm bù đắp UTC cho thời gian hiện tại, không phải là múi giờ? –
Có, nếu đó là những gì bạn quan tâm (đó cũng là những gì nó âm thanh như tôi), câu trả lời này là tại chỗ trên. Tôi đã trả lời nhiều hơn để "nhận được múi giờ địa phương không được hiển thị rất tốt trong một API được triển khai rộng rãi". Chỉ cần lưu ý rằng số dư UTC bạn nhận được cho ngày hôm nay có thể khác sau (hoặc sớm hơn). –