#include <iostream>
#include <cmath>
#include <ctime> // để lấy thời gian hệ thống
#include <cstring> // để dùng strcpy
using namespace std;
struct ThoiGian {
int gio, phut, giay;
};
struct Ngay {
int ngay, thang, nam;
};
int doi_sang_giay(ThoiGian t); // Hàm đổi giờ, phút, giây → tổng số giây
bool nam_nhuan(int nam); // Hàm kiểm tra năm nhuận
int so_ngay_trong_thang(int thang, int nam); // Hàm số ngày trong một tháng
long long doi_sang_so_ngay(Ngay d); // Hàm đổi ngày/tháng/năm → tổng số ngày kể từ 01/01/0001
int thu_trong_tuan(Ngay d); // Hàm tính thứ trong tuần (0 = Chủ nhật, 1 = Thứ hai, ...)
const char* ten_thu(int thu); //// Trả về tên thứ (dạng const char*)
void truong_hop_a(); // TH1: Hai thời điểm trong cùng một ngày
void truong_hop_b(); // TH2: Hai thời điểm liên tiếp, t2 có thể là ngày hôm sau
void truong_hop_c(); // TH3: Hai ngày bất kỳ
void truong_hop_d(); // TH4: Ngày hôm nay (t1) và ngày t2 nhập vào
int main() {
cout << "=== CHUONG TRINH TINH KHOANG THOI GIAN GIUA HAI THOI DIEM ===\n";
cout << "Chon truong hop can tinh:\n";
cout << "a) Hai thoi diem trong ngay (h, m, s)\n";
cout << "b) Hai thoi diem lien tiep, t2 co the la ngay hom sau\n";
cout << "c) Hai ngay trong nam (ngay, thang, nam)\n";
cout << "d) t1 la hom nay, tinh khoang cach den t2 va xac dinh thu\n";
cout << "Nhap lua chon (a/b/c/d): ";
char chon;
cin >> chon;
switch (chon) {
case 'a': case 'A': truong_hop_a(); break;
case 'b': case 'B': truong_hop_b(); break;
case 'c': case 'C': truong_hop_c(); break;
case 'd': case 'D': truong_hop_d(); break;
default:
cout << "Lua chon khong hop le!\n";
}
return 0;
}
int doi_sang_giay(ThoiGian t) {
return t.gio * 3600 + t.phut * 60 + t.giay;
}
bool nam_nhuan(int nam) {
return (nam % 4 == 0 && nam % 100 != 0) || (nam % 400 == 0);
}
int so_ngay_trong_thang(int thang, int nam) {
int ngay_thang[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (thang == 2 && nam_nhuan(nam)) return 29;
return ngay_thang[thang];
}
long long doi_sang_so_ngay(Ngay d) {
long long tong = 0;
for (int i = 1; i < d.nam; i++)
tong += nam_nhuan(i) ? 366 : 365;
for (int i = 1; i < d.thang; i++)
tong += so_ngay_trong_thang(i, d.nam);
tong += d.ngay;
return tong;
}
int thu_trong_tuan(Ngay d) {
int q = d.ngay;
int m = d.thang;
int y = d.nam;
if (m < 3) { // nếu là tháng 1 hoặc 2 thì coi như tháng 13,14 của năm trước
m += 12;
y--;
}
int h = (q + 13*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
return (h + 6) % 7; // đổi về hệ 0=CN, 6=Thứ 7
}
const char* ten_thu(int thu) {
const char* t[] = {
"Chu nhat", "Thu hai", "Thu ba",
"Thu tu", "Thu nam", "Thu sau", "Thu bay"
};
return t[thu];
}
void truong_hop_a() {
ThoiGian t1, t2;
cout << "Nhap thoi diem t1 (gio phut giay): ";
cin >> t1.gio >> t1.phut >> t1.giay;
cout << "Nhap thoi diem t2 (gio phut giay): ";
cin >> t2.gio >> t2.phut >> t2.giay;
int hieu = abs(doi_sang_giay(t2) - doi_sang_giay(t1));
cout << "=> Khoang thoi gian giua hai thoi diem la: " << hieu << " giay\n";
}
void truong_hop_b() {
ThoiGian t1, t2;
cout << "Nhap thoi diem t1 (gio phut giay): ";
cin >> t1.gio >> t1.phut >> t1.giay;
cout << "Nhap thoi diem t2 (gio phut giay): ";
cin >> t2.gio >> t2.phut >> t2.giay;
int giay1 = doi_sang_giay(t1);
int giay2 = doi_sang_giay(t2);
int hieu;
if (giay2 >= giay1)
hieu = giay2 - giay1;
else
hieu = (24 * 3600 - giay1) + giay2; // t2 thuộc ngày hôm sau
cout << "=> Khoang thoi gian giua t1 va t2 la: " << hieu << " giay\n";
}
void truong_hop_c() {
Ngay n1, n2;
cout << "Nhap ngay t1 (ngay thang nam): ";
cin >> n1.ngay >> n1.thang >> n1.nam;
cout << "Nhap ngay t2 (ngay thang nam): ";
cin >> n2.ngay >> n2.thang >> n2.nam;
long long so1 = doi_sang_so_ngay(n1);
long long so2 = doi_sang_so_ngay(n2);
long long hieu = so2 - so1;
cout << "=> Khoang thoi gian giua t1 va t2 la: " << hieu << " ngay\n";
cout << "Thu cua t1: " << ten_thu(thu_trong_tuan(n1)) << endl;
cout << "Thu cua t2: " << ten_thu(thu_trong_tuan(n2)) << endl;
}
void truong_hop_d() {
time_t bay_gio = time(0);
tm *hientai = localtime(&bay_gio);
Ngay n1;
n1.ngay = (*hientai).tm_mday;
n1.thang = (*hientai).tm_mon + 1;
n1.nam = (*hientai).tm_year + 1900;
cout << "Hom nay la: " << n1.ngay << "/" << n1.thang << "/" << n1.nam
<< " (" << ten_thu(thu_trong_tuan(n1)) << ")\n";
Ngay n2;
cout << "Nhap ngay t2 (ngay thang nam): ";
cin >> n2.ngay >> n2.thang >> n2.nam;
long long so1 = doi_sang_so_ngay(n1);
long long so2 = doi_sang_so_ngay(n2);
long long hieu = so2 - so1;
cout << "=> t2 cach hom nay " << hieu << " ngay\n";
cout << "Thu cua t2 la: " << ten_thu(thu_trong_tuan(n2)) << endl;
}