2012-03-03 26 views

Trả lời

2

C (POSIX) cung cấp chức năng cho việc này. Sử dụng strptime() để chuyển đổi chuỗi thành giá trị struct tm. Sau đó, bạn có thể chuyển đổi struct tm thành time_t bằng cách sử dụng mktime().

+2

Đó không phải là tiêu chuẩn, C, là POSIX. –

2

Trích xuất các mảnh với một sscanf, cư struct tm (từ <time.h>) với các dữ liệu được chiết xuất, và cuối cùng là sử dụng mktime để chuyển nó sang time_t.

time_t ParseDate(const char * str) 
{ 
    struct tm ti={0}; 
    if(sscanf(str, "%d-%d-%d", &ti.tm_year, &ti.tm_mon, &ti.tm_day)!=3) 
    { 
     /* ... error parsing ... */ 
    } 
    ti.tm_year-=1900 
    ti.tm_mon-=1 
    return mktime(&ti); 
} 
0

đọc nó thành một struct tm và gọi mktime để có được time_t của bạn.

1

Giờ địa phương hoặc UTC? Nếu đó là UTC, cách dễ nhất để làm việc chuyển đổi là để tránh API thời gian C hoàn toàn và sử dụng công thức trong POSIX cho giây kể từ khi kỷ nguyên:

tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
    (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - 
    ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400 

Nguồn: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_15

Nếu đó là giờ địa phương, vấn đề biến thành địa ngục do thực tế rằng time_t không được đảm bảo được biểu diễn bằng giây kể từ kỷ nguyên ngoại trừ trên hệ thống POSIX và thực tế là khó tính được giá trị time_t tương ứng với kỷ nguyên (mktime sẽ không hoạt động vì nó sử dụng giờ địa phương). Một khi bạn tính toán time_t cho kỷ nguyên, mặc dù, nó chỉ là vấn đề sử dụng mktime cho giá trị thời gian bạn phân tích cú pháp và sau đó gọi difftime.

Các vấn đề liên quan