Tôi có thời gian được biểu thị bằng số giây đã trôi qua kể từ nửa đêm, ngày 1 tháng 1 năm 1970, UTC (kết quả của cuộc gọi trước đó đến thời gian()). Làm cách nào để thêm một ngày vào thời điểm này?Cách thêm một ngày vào một thời điểm thu được từ thời gian()
Thêm 24 * 60 * 60 hoạt động trong hầu hết các trường hợp, nhưng không thành công nếu thời gian tiết kiệm ánh sáng ban ngày bật hoặc tắt ở giữa. Nói cách khác, tôi chủ yếu muốn thêm 24 giờ, nhưng đôi khi 23 hoặc 25 giờ.
Để minh họa - chương trình:
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
time_t time = base + i * 24 * 60 * 60;
std::cout << ctime(&time);
}
return 0;
}
Tạo:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
Tôi muốn thời gian cho March 12, 13, ... để cũng được 08:00.
Câu trả lời được cung cấp bởi FigBug đã chỉ cho tôi đúng hướng. Nhưng tôi phải dùng localtime thay vì gmtime.
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
std::cout << asctime(tm);
}
return 0;
}
Hãy cho tôi:
Sat Mar 11 08:00:00 2006
Sat Mar 12 08:00:00 2006
Sat Mar 13 08:00:00 2006
Sat Mar 14 08:00:00 2006
Đó là những gì tôi muốn. Sử dụng gmtime mang lại cho tôi thời gian lúc 14:00:00
Tuy nhiên, lưu ý rằng tất cả các ngày đều là Thứ Bảy. Ngoài ra, nó đi đến tháng 32, 33, vv Nếu tôi ném trong hàm mktime Tôi trở lại nơi tôi bắt đầu:
#include <time.h>
#include <iostream>
int main()
{
time_t base = 1142085600;
for(int i = 0; i < 4; ++i) {
struct tm* tm = localtime(&base);
tm->tm_mday += i;
time_t time = mktime(tm);
std::cout << asctime(tm);
}
return 0;
}
Cung cấp cho tôi:
Sat Mar 11 08:00:00 2006
Sun Mar 12 09:00:00 2006
Mon Mar 13 09:00:00 2006
Tue Mar 14 09:00:00 2006
tôi thiếu gì ???
OK, tôi đã cố gắng ra đề nghị mới nhất FigBug của đó là sử dụng:
std::cout << ctime(&time);
thay vì asctime, nhưng tôi nhận được kết quả tương tự. Vì vậy, tôi đoán rằng thư viện của tôi và/hoặc trình biên dịch là sai lầm. Tôi đang sử dụng g ++ 3.4.4 trên Cygwin. Tôi đã sao chép các tập tin trên Solaris 5.8 và sử dụng g ++ 3.3 để biên dịch. Tôi nhận được kết quả chính xác ở đó! Trong thực tế tôi nhận được kết quả chính xác cho dù tôi sử dụng ctime hoặc asctime cho đầu ra:
Sat Mar 11 08:00:00 2006
Sun Mar 12 08:00:00 2006
Mon Mar 13 08:00:00 2006
Tue Mar 14 08:00:00 2006
Tôi cũng có được kết quả chính xác (với cả hai chức năng đầu ra) trên Red Hut Linux với g ++ 3.4.6.
Vì vậy, tôi đoán rằng tôi đã gặp một lỗi Cygwin.
Cảm ơn bạn cho tất cả sự giúp đỡ và tư vấn của bạn ....
Tôi nghĩ bạn muốn sử dụng ctime không asctime trong phiên bản cuối cùng vì bạn muốn thời gian trong múi giờ địa phương của bạn. time() trả về UTC, localtime() chuyển đổi nó thành múi giờ của bạn. Thêm một ngày trong múi giờ của bạn, chuyển đổi thành UTC. In ra trong múi giờ của bạn với ctime(). Vì vậy, khó hiểu. –
Một dòng khác: tm-> tm_wday = (tm-> tm_wday + i)% 7; –
Bạn không cần phải lo lắng về điều đó: từ tài liệu mktime: Giá trị ban đầu của thành viên tm_wday và tm_yday của timeptr bị bỏ qua và phạm vi giá trị cho phần còn lại của thành viên không bị giới hạn ở giá trị bình thường của chúng (như tm_mday nằm trong khoảng từ 1 đến 31). –