Bạn nên tránh đặt tm_isdst thành -1 nếu có thể. Hệ thống không phải lúc nào cũng có thể xác định trạng thái DST từ ngày và giờ. Đó là mơ hồ giờ trước và sau khi DST kết thúc. Ví dụ: nếu bạn vượt qua mktime()
1:30 SA ngày 4 tháng 11 năm 2012, thì không đủ thông tin để nhận được giá trị time_t
chính xác từ mktime()
. Thông thường tôi đã thấy mktime()
giả định thời gian tiêu chuẩn trong trường hợp đó là mơ hồ, nhưng tôi đã không thấy bất kỳ tài liệu nào đảm bảo rằng hành vi trên tất cả các nền tảng. 1:30 sáng ngày 4 tháng 11 năm 2012 với tm_isdst == 1
sẽ là 1 giờ trước, vì giờ 1:00:00 đến 1:59:59 lặp lại.
#include <stdio.h>
#include <time.h>
int main()
{
time_t daylight, standard;
struct tm timestr;
double diff;
timestr.tm_year = 2012 - 1900;
timestr.tm_mon = 11 - 1;
timestr.tm_mday = 4;
timestr.tm_hour = 1;
timestr.tm_min = 30;
timestr.tm_sec = 0;
/* first with standard time */
timestr.tm_isdst = 0;
standard = mktime(×tr);
/* now with daylight time */
timestr.tm_isdst = 1;
daylight = mktime(×tr);
diff = difftime(standard, daylight);
printf("Difference is %f hour(s)", diff/60.0/60.0);
return 0;
}
này tạo ra:
Difference is 1.000000 hour(s)
Cả hai đều là ngày 04 tháng 11 năm 2012 01:30, tuy nhiên cả hai đều là hai giá trị time_t riêng biệt, 1 giờ xa nhau.
mktime()
về cơ bản có 2 kết quả đầu ra:
- time_t
- thời gian sửa chữa struct
Hiện struct là cả một đầu vào và đầu ra. Nó được sửa đổi bởi mktime()
để trả về tất cả các thành viên cấu trúc theo phạm vi danh nghĩa. Ví dụ: nếu bạn tăng thành viên tm_hour += 500
, điều đó có nghĩa là tăng thời gian thêm 500 giờ. Thành viên tm_hour
sẽ được thay đổi thành giá trị từ 00 đến 59 và tm_day
, tm_mday
và tất cả sẽ được điều chỉnh cho phù hợp. tm_isdst
cũng là cả đầu vào và đầu ra. giá trị của nó như sau:
- 1 (DST có hiệu lực, ví dụ: điều chỉnh giờ)
- 0 (DST không có hiệu lực, ví dụ:thời gian tiêu chuẩn)
- -1 (tình trạng DST Unknown)
Vì vậy mktime() sẽ ra 1 hoặc 0 cho tm_isdst, không bao giờ -1.
-1 có thể là đầu vào, nhưng tôi nghĩ nó có nghĩa là "Không xác định". Đừng nghĩ rằng nó có nghĩa là "xác định tự động", bởi vì nói chung, mktime()
không phải lúc nào cũng tự động xác định nó.
Trạng thái DST rõ ràng (0 hoặc 1) phải đến từ một thứ gì đó bên ngoài phần mềm, ví dụ như lưu trữ nó trong tệp hoặc cơ sở dữ liệu hoặc nhắc người dùng.
Nguồn
2012-08-24 18:49:44
Vâng, nếu bạn không biết DST, bạn cần xác định nó (may mắn với điều đó), hoặc đặt nó thành '-1'. Không có lựa chọn nào khác. Nếu bạn đặt nó là 0, bạn sẽ không nhận được DST ở tất cả những gì được bảo đảm sai, nếu bạn đặt nó thành 1, bạn buộc DST trên đó cũng được bảo đảm sai. – rustyx
@RustyX Mã hóa cứng tới -1, 0 hoặc 1 sẽ luôn sai. -1 là ít nhất là xấu, nhưng vẫn còn xấu. Trạng thái rõ ràng (0 hoặc 1) phải là _input_ đối với phần mềm từ người dùng hoặc được lưu trữ trong dữ liệu (tệp hoặc cơ sở dữ liệu). Về cơ bản nó phải đến từ một cái gì đó bên ngoài ứng dụng. –
v câu trả lời hay. Cảm ơn – drlolly