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 now
là một giá trị không thể thiếu rõ ràng, trong khi local
và gm
đang struct tm
lư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 tm
là
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 tm
chứ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ờ HKT
dành cho local
và múi giờ UTC
dành cho gm
?
Nếu đó không phải là tất cả những gì struct tm
chứ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 để strftime
biết trả lời theo những cách khác nhau cho hai struct tm
đối tượng? Trừ khi tm
có 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
.
tm
trú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()
.
strftime
nó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.
tm
có thêm thông tin. Đây là một . Lưu ý các const char *tm_zone
thành viên. Bạn đang biên dịch cho nền tảng nào? Hãy xem việc tm
triển khai để xem họ đã mở rộng cấu trúc chưa.
tm
không chứa thông tin múi giờ.strftime
có đượ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 đó ... .