Witam. Jak sprawdzić, czy podana wartość sekund od 1970 roku jest w tym samym tygodniu, co obecna liczba sekund od 1970 roku pobrana za pomocą funkcji std::time(NULL)?
Otóż kod ma wyświetlać datę na podstawie podanej liczby sekund od roku 1970. Chciałbym wyświetlać datę w podobny sposób, jak robi to messenger. Jeżeli wiadomość wysłana dzisiaj pokazuj godzinę, minuty i sekundy. Jeżeli wiadomość wysłana wczoraj pokazuj wczoraj. Jeżeli wiadomość wysłana w tym tygodniu pokazuj dzień tygodnia...
I teraz właśnie tutaj napotkałem problem, jak sprawdzić, czy podana liczba sekund od 1970 roku jest w tym samym tygodniu (czyli w zakresie poniedziałek godzina 00:00:00 - niedziela 23:59:59), co obecna liczba sekund od 1970 roku pobrana za pomocą funkcji std::time(NULL)?
#pragma once
#include <ctime>
class DateConsoleOutputStream;
class Date
{
public:
Date(std::time_t secondsFromYear1970 = 0);
void set(std::time_t secondsFromYear1970);
void setCurrentLocalTime();
bool isToday() const;
bool isYesterday() const;
// TODO isThisWeek
bool isThisMonth() const;
bool isThisYear() const;
private:
std::tm time;
std::tm getCurrentLocalTime() const;
friend class DateConsoleOutputStream;
};
class DateConsoleOutputStream
{
public:
void showHour(const Date& date) const;
void showMinutes(const Date& date) const;
void showSeconds(const Date& date) const;
void showDayOfWeek(const Date& date) const;
void showDayOfMonth(const Date& date) const;
void showMonth(const Date& date) const;
void showYear(const Date& date) const;
};
#include "Date.h"
#include <iostream>
Date::Date(std::time_t secondsFromYear1970)
{
localtime_s(&this->time, &secondsFromYear1970);
}
void Date::set(std::time_t secondsFromYear1970)
{
localtime_s(&this->time, &secondsFromYear1970);
}
void Date::setCurrentLocalTime()
{
std::time_t currentTimeInSecondsFromYear1970 = std::time(NULL);
localtime_s(&time, ¤tTimeInSecondsFromYear1970);
}
bool Date::isToday() const
{
std::tm currentTime = getCurrentLocalTime();
return isThisYear() && currentTime.tm_yday == time.tm_yday;
}
bool Date::isYesterday() const
{
std::tm currentTime = getCurrentLocalTime();
return isThisYear() && currentTime.tm_yday - 1 == time.tm_yday;
}
bool Date::isThisMonth() const
{
std::tm currentTime = getCurrentLocalTime();
return isThisYear() && currentTime.tm_mon == time.tm_mon;
}
bool Date::isThisYear() const
{
std::tm currentTime = getCurrentLocalTime();
return currentTime.tm_year == time.tm_year;
}
std::tm Date::getCurrentLocalTime() const
{
std::time_t currentTimeInSeconds = std::time(NULL);
std::tm currentTime;
localtime_s(¤tTime, ¤tTimeInSeconds);
return currentTime;
}
void DateConsoleOutputStream::showHour(const Date& date) const
{
if (date.time.tm_hour < 10)
std::cout << "0";
std::cout << date.time.tm_hour;
}
void DateConsoleOutputStream::showMinutes(const Date& date) const
{
if (date.time.tm_min < 10)
std::cout << "0";
std::cout << date.time.tm_min;
}
void DateConsoleOutputStream::showSeconds(const Date& date) const
{
if (date.time.tm_sec < 10)
std::cout << "0";
std::cout << date.time.tm_sec;
}
void DateConsoleOutputStream::showDayOfWeek(const Date& date) const
{
enum DAYS_OF_WEEK { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
switch (date.time.tm_wday)
{
case SUNDAY:
std::cout << "Niedziela";
break;
case MONDAY:
std::cout << "Poniedzialek";
break;
case TUESDAY:
std::cout << "Wtorek";
break;
case WEDNESDAY:
std::cout << "Sroda";
break;
case THURSDAY:
std::cout << "Czwartek";
break;
case FRIDAY:
std::cout << "Piatek";
break;
case SATURDAY:
std::cout << "Sobota";
break;
}
}
void DateConsoleOutputStream::showDayOfMonth(const Date& date) const
{
if (date.time.tm_mday < 10)
std::cout << "0";
std::cout << date.time.tm_mday;
}
void DateConsoleOutputStream::showMonth(const Date& date) const
{
if (date.time.tm_mon + 1 < 10)
std::cout << "0";
std::cout << date.time.tm_mon + 1;
}
void DateConsoleOutputStream::showYear(const Date& date) const
{
std::cout << date.time.tm_year + 1900;
}
W skrócie: jak napisać funkcję isThisWeek()?