Создать пользовательский класс DateTime
Моя задача - реализовать собственный класс DateTime, атрибутами которого являются секунды, минуты, часы, дни месяца, месяца, года. У меня возникли трудности с реализацией методов void AddDays(int N), AddMonth(int N), AddYears(int N). Функции должны работать правильно, учитывать прибавление в високосном и обычном году. Пытался повторить устройство системного класса, но не получилось понять идею. Подскажите какие-нибудь соображение по правильному устройству этих функций.
public TimeDate(int second, int minute, int hour,
int day, int month, int year)
{
_second = second;
_minute = minute;
_hour = hour;
_day = day;
_month = month;
_year = year;
}
private long _second;
private long _minute;
private long _hour;
private long _day;
private long _month;
private long _year;
private long[] dayYear = {0,31,28,31,30,31,30,31,31,30,31,30,31};
private long[] dayYearLeap ={0,31,29,31,30,31,30,31,31,30,31,30,31};
private bool isLeap()
{
if (_year % 4 == 0)
{
if (_year % 100 == 0)
{
if (_year % 400 == 0)
{
return true;
}
return false;
}
return true;
}
return false;
}
public void AddDays(int N)
{
long N_in_second = N * 60*60*24;
long second_now = _second + _minute * 60 + _hour * 60 * 60 + _day * 60 * 60 * 24;
if (isLeap())
{
second_now += _month*3600*24*dayYearLeap[_month]+
_year * 60 * 60 * 24 * dayYearLeap[_month] * 12;
}
else
{
second_now += _month * 3600 * 24 * dayYear[_month] +
_year * 60 * 60 * 24 * dayYear[_month] * 12;
}
second_now += N_in_second;
_year = second_now / (60*60*24*12*dayYear[_month]);
second_now -= 60 * 60 * 24 * 12 * dayYear[_month];
_month = second_now / (60 * 60 * 24 * dayYear[_month]) % 12;
if (_month == 0) _month = 12;
second_now -= (60 * 60 * 24 * dayYear[_month]);
_day = second_now / (60 * 60 * 24) % dayYear[_month];
second_now -= (60 * 60 * 24);
_hour = second_now / (60 * 60) % 24;
second_now -= (60 * 60);
_minute = second_now / 60 % 60;
second_now -= 60;
_second = second_now % 60;
}
При вводе TimeDate date = new TimeDate(34,27,13,28,2,2019);date.AddDays(1); На выходе получаем: Second: 34, Minute: 27, Hour: 13, Day: 8, Month: 3,Year: 2019. Добавились лишние 7 дней. Как это исправить?
Ответы (1 шт):
public void AddDays(int N)
{
if (N >= 0)
{
for (int i = 0; i < N; i++)
{
_day++;
if (isLeap())
{
if (_day > dayYearLeap[_month])
{
_day = 1;
_month++;
if (_month > 12)
{
_year++;
_month = 1;
}
}
}
else
{
if (_day > dayYear[_month])
{
_day = 1;
_month++;
if (_month > 12)
{
_year++;
_month = 1;
}
}
}
}
}
else
{
for (int i = 0; i < Math.Abs(N); i++)
{
_day--;
if (_day == 0)
{
_month--;
if (isLeap())
{
if (_month < 1)
{
_year--;
_month = 12;
}
_day = dayYearLeap[_month];
}
else
{
if (_month < 1)
{
_year--;
_month = 12;
}
_day = dayYear[_month];
}
}
}
}
}