Hãy xem xét mã C ++ sau đây
#include <ctime>
#include <iostream>
int main()
{
std::time_t now = std::time(nullptr);
struct tm local = *std::localtime(&now);
struct tm gm = *std::gmtime(&now);
char str[20];
std::strftime(str, 20, "%Z", &local);
std::cout << str << std::endl; // HKT
std::strftime(str, 20, "%Z", &gm);
std::cout << str << std::endl; // UTC
return 0;
}
Vì vậy, lưu trữ trong nowlà một giá trị không thể thiếu rõ ràng, trong khi localvà gmđang struct tmlưu trữ thông tin ngày / giờ con người có thể đọc được. Sau đó, tôi in ra thông tin được định dạng (múi giờ) chỉ dựa trên các struct tmđối tượng.
Theo cplusplus tài liệu tham khảo , các thành viên dữ liệu struct tmlà
tm_sec
tm_min
tm_hour
tm_mday
tm_mon
tm_year
tm_wday
tm_yday
tm_isdst
Nếu đó là tất cả những gì struct tmchứa, làm thế nào để chương trình biết rằng thông tin múi giờ từ nó? Đó là, làm thế nào để biết rằng múi giờ HKTdành cho localvà múi giờ UTCdành cho gm?
Nếu đó không phải là tất cả những gì struct tmchứa, vui lòng giải thích cách lưu trữ thông tin múi giờ.
Nhân tiện, mặc dù mã demo là trong C ++, tôi đoán câu hỏi này thực chất cũng là một câu hỏi C hợp pháp.
tm, làm thế nào để strftimebiết trả lời theo những cách khác nhau cho hai struct tmđối tượng? Trừ khi tmcó chứa một số thông tin như này tmđược tạo ra bởilocaltime , mà tmđược tạo ra bởigmtime .
tmtrúc không lưu trữ các múi giờ, điều gì khiến bạn nghĩ nó như vậy? Sự khác biệt là trong các cuộc gọi đến gmtime()và localtime().
strftimenói với những kẻ hút nhau. Nên thêm rằng POSIX để lại những gì xảy ra không xác định.
tmcó thêm thông tin. Đây là một . Lưu ý các const char *tm_zonethành viên. Bạn đang biên dịch cho nền tảng nào? Hãy xem việc tmtriển khai để xem họ đã mở rộng cấu trúc chưa.
tmkhông chứa thông tin múi giờ.strftimecó được múi giờ bởi voodoo đằng sau hậu trường. Nếu bạn muốn có được múi giờ nói chung, đó là một chút lộn xộn. ( Hiện tại ) không có cách tiêu chuẩn để có được múi giờ. May mắn thay Howard Hinnant là công việc đó ... .