Sử dụng này free, open-source library:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono_literals;
try
{
auto zone = locate_zone("America/New_York");
zone->to_sys(local_days{mar/13/2016} + 2h + 30min);
}
catch (const std::exception& e)
{
std::cout << e.what() << '\n';
}
}
Kết quả của chương trình này là:
2016-03-13 02:30 is in a gap between
2016-03-13 02:00:00 EST and
2016-03-13 03:00:00 EDT which are both equivalent to
2016-03-13 07:00:00 UTC
Nói tóm lại, chương trình này cố gắng dịch một ngày locale/thời gian 2016- 03-13 02:30:00 đến UTC sử dụng múi giờ "America/New_York". Bản dịch ném một ngoại lệ vì giờ địa phương không tồn tại. Một ngoại lệ cũng được ném (với một thông báo lỗi khác), nếu thời gian cục bộ không rõ ràng, chẳng hạn như khi thiết lập đồng hồ địa phương trở lại từ tiết kiệm ánh sáng ban ngày.
Thư viện cũng cung cấp cú pháp để tránh những ngoại lệ này nếu đó là mong muốn.
Điều này hoạt động trên VS-2013, VS-2015, clang và gcc. Nó đòi hỏi C++ 11, C++ 14 hoặc C++ 1z.
Liên kết ở trên trỏ đến tài liệu. Đây là kho github:
https://github.com/HowardHinnant/date
Nguồn
2016-04-10 15:08:33
Một câu hỏi thú vị, chắc chắn. Bạn cũng cần hỗ trợ bước nhảy vọt trong ngày thứ hai, như ngày 30 tháng 6 năm 2015, 23,59,60? (Nếu để các quy tắc ra khỏi API thời gian của Google), tôi nghĩ * tăng thư viện ngày giờ sẽ là điểm khởi đầu tốt nhất.Tôi sử dụng những thư viện này nhưng không sử dụng cho điều đặc biệt này. – Bathsheba
Tôi đã gắn thẻ "boost-date-time" và, có lẽ là vô nghĩa, "tăng" vì tôi tưởng tượng một giải pháp có thể có sẵn trong hộp cho điều này, hoặc không đặc biệt khó thực hiện trong khuôn khổ đó. – Bathsheba
Thư viện C++ tiêu chuẩn không hoạt động với thời gian. Nếu bạn nhắm mục tiêu Windows thì bạn có thể sử dụng SystemTimeToFileTime() hoặc SystemTimeToTzSpecificLocalTime(). Việc gửi một ngày không hợp lệ làm cho hàm bị lỗi với ERROR_INVALID_PARAMETER. Nếu nó phải là nền tảng chéo thì bạn phải đi mua sắm cho một thư viện. –