Операция добавления дней к дате - C#

Узнай цену своей работы

Формулировка задачи:

Ребят, надо создать метод, который добавлял дни к написанной ранее дате, и доходя до 31, начинал считать заново, также правильно расчитал месяцы, т.е. если например к 1 январю добавить 62 дня, сделать так, чтобы получилось 1 марта(надеюсь все правильно написал) Спасибо)
using System;
 
namespace Date2
{
    class Program
    {
        static void Main()
        {
            Console.Write("Введите год, месяц и день (через точку): ");
            var parts = Console.ReadLine().Split('.');//разделение даты на составляющие
            var date1 = new Date(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]));//создание об через полныйконструктор
            date1.Print();//писанина даты на экран
            Console.ReadKey();
        }
    }
    public class Date
    {
        private int _day;
        private int _month;
        private int _year;
        private string _monthstr = "";
        private readonly bool _flag = true;

        ~Date()
        {
            Console.WriteLine("деструктор " + this + " уничтожен");
            Console.ReadLine();
        }
 
        public Date()//базовый конструктор
        {
            _day = 0;
            _month = 0;
            _year = 0;
        }
        public Date(int day, int month, int year)//с введением данных
        {
            _flag = Proverka(day, month, year);//вызов метода на проверку данных
            _monthstr = ConvertMonthToString(month);//конвертация числа в слово месяца
        }
        public void Print()//вывод на экран
        {
            if (_flag)
            {
                Console.WriteLine("Введенная дата : {0} {1} {2}", _day, _monthstr, _year);
                Sravnenie();//вызов метода сравнения текущей и введеннолй даты
            }
        }
        public string ConvertMonthToString(int month)//Конвертируем месяц в строку.
        {
            string[] strMonthArr = { "Янв", "Фев", "Maрт", "Апр", "Мая", "Июня", "Июля", "Авг", "Сент", "Окт", "Нояб", "Дек" };
            _monthstr = strMonthArr[month - 1];
            return _monthstr;
        }
 
        public bool Proverka(int day, int month, int year)//метод проверки введенной даты
        {
            if (day >= 1 && day <= 31 && month >= 1 && month <= 12 && year > 0)
            {
                _day = day;
                _month = month;
                _year = year;
                return true;
            }
            Console.WriteLine("Введен не правильный день, месяц или год");
            return false;
        }
        public void Sravnenie()//метод сравнения даты
        {
            Console.WriteLine("Сегодня : {0}", DateTime.Today.ToShortDateString());
            if (_day < DateTime.Today.Day || _month < DateTime.Today.Month || _year < DateTime.Today.Year)
                Console.WriteLine("Текущаяя дата больше введенной");
            else
                Console.WriteLine("Текущаяя дата меньше введенной");
        }
 
    }
}

Решение задачи: «Операция добавления дней к дате»

textual
Листинг программы
public struct Date
{
    public int _days;
    
    public Date(int year, int month, int day)
    {
        _days = DateToDays(year, month, day);
    }
    
    private Date(int days)
    {
        _days = days;
    }
    
    public int Day { get { return GetDatePart(DatePartDay); } }
    public int Month { get { return GetDatePart(DatePartMonth); } }
    public int Year { get { return GetDatePart(DatePartYear); } }
    
    public Date AddDays(int days)
    {
        return new Date(_days + days);
    }
    
    private static readonly int[] DaysToMonth365 = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
    private static readonly int[] DaysToMonth366 = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};    
 
    // Number of days in a non-leap year
    private const int DaysPerYear = 365;
    // Number of days in 4 years
    private const int DaysPer4Years = DaysPerYear * 4 + 1;       // 1461    
    // Number of days in 100 years
    private const int DaysPer100Years = DaysPer4Years * 25 - 1;  // 36524
    // Number of days in 400 years
    private const int DaysPer400Years = DaysPer100Years * 4 + 1; // 146097
 
    private const int DatePartYear = 0;
    private const int DatePartDayOfYear = 1;
    private const int DatePartMonth = 2;
    private const int DatePartDay = 3;
    
    private static int DateToDays(int year, int month, int day)
    {     
        if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
        {
            int[] days = DateTime.IsLeapYear(year) ? DaysToMonth366 : DaysToMonth365;
            if (day >= 1 && day <= days[month] - days[month - 1])
            {
                int y = year - 1;
                int n = y * 365 + y / 4 - y / 100 + y / 400 + days[month - 1] + day - 1;
                return n;
            }
        }
        throw new ArgumentOutOfRangeException(null, "");
    } 
    
    // Returns a given date part of this DateTime. This method is used
    // to compute the year, day-of-year, month, or day part.
    private int GetDatePart(int part)
    {
        // n = number of days since 1/1/0001
        int n = _days;
        // y400 = number of whole 400-year periods since 1/1/0001
        int y400 = n / DaysPer400Years;
        // n = day number within 400-year period
        n -= y400 * DaysPer400Years;
        // y100 = number of whole 100-year periods within 400-year period
        int y100 = n / DaysPer100Years;
        // Last 100-year period has an extra day, so decrement result if 4
        if (y100 == 4) y100 = 3;
        // n = day number within 100-year period
        n -= y100 * DaysPer100Years;
        // y4 = number of whole 4-year periods within 100-year period
        int y4 = n / DaysPer4Years;
        // n = day number within 4-year period
        n -= y4 * DaysPer4Years;
        // y1 = number of whole years within 4-year period
        int y1 = n / DaysPerYear;
        // Last year has an extra day, so decrement result if 4
        if (y1 == 4) y1 = 3;
        // If year was requested, compute and return it
        if (part == DatePartYear) {
            return y400 * 400 + y100 * 100 + y4 * 4 + y1 + 1;
        }
        // n = day number within year
        n -= y1 * DaysPerYear;
        // If day-of-year was requested, return it
        if (part == DatePartDayOfYear) return n + 1;
        // Leap year calculation looks different from IsLeapYear since y1, y4,
        // and y100 are relative to year 1, not year 0
        bool leapYear = y1 == 3 && (y4 != 24 || y100 == 3);
        int[] days = leapYear? DaysToMonth366: DaysToMonth365;
        // All months have less than 32 days, so n >> 5 is a good conservative
        // estimate for the month
        int m = n >> 5 + 1;
        // m = 1-based month number
        while (n >= days[m]) m++;
        // If month was requested, return it
        if (part == DatePartMonth) return m;
        // Return 1-based day-of-month
        return n - days[m - 1] + 1;
    }    
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы