using Avalonia.Controls; using Avalonia.Media; using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using static System.Runtime.InteropServices.JavaScript.JSType; namespace AvaloniaApplication5 { public partial class MainWindow : Window { string date = ""; //Строка даты, которую будет вводить пользователь DateTime currentDate = DateTime.Now; //Текущая дата public MainWindow() { InitializeComponent(); } /// /// Событие обработчик нажатия на кнопку "Проверить дату". /// /// /// private void Button_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { date = dp.SelectedDate.ToString(); tbMessage.IsVisible = true; if (date != "") { DateTime dt = Convert.ToDateTime(date); if (currentDate > dt) { TimeSpan difference = currentDate - dt; int years = difference.Days / 365; int months = difference.Days % 365 / 30; int days = difference.Days % 365 % 30; List leadYears = new List(); DayOfWeek dayOfWeek = (DayOfWeek)(dt.DayOfWeek); string dayOfWeekPreview = CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(dayOfWeek); CultureInfo.CurrentCulture.DateTimeFormat.GetDayName(dayOfWeek); tbMessage.Text = $"С дня рождения прошло {years} г. {months} мес. {days} дн. \n" + $"Вы родились в {dayOfWeekPreview}\n" + $"В {dayOfWeekPreview} вы отпраздновали день рождения {GetNumberDayAfterDate(dt, currentDate, dayOfWeek)} раз\n" + $"Високосных лет прошло: {GetCountLeapYear(dt, ref leadYears)}\n" + $"А конкретно: {string.Join(",", leadYears)} "; sbVivibleZodiack.IsVisible = true; } else tbMessage.Text = $"Вы не могли родиться позже текущей даты"; } else tbMessage.Text = $"Вы не выбрали дату"; } /// /// Получение количества дней рождения, которые отпраздновал пользователь в конкретный день недели за всю свою жизнь /// /// Дата рождения /// Текущая дата /// День недели /// Количество дней рождения определенного дня недели int GetNumberDayAfterDate(DateTime dateBirth, DateTime now, DayOfWeek dayOfWeek) { int count = 0; for (int i = dateBirth.Year; i <= now.Year; i++) { DateTime date = new DateTime(i, dateBirth.Month, dateBirth.Day); if (date.DayOfWeek == dayOfWeek) count++; } if (now.Month > dateBirth.Month && now.Day > dateBirth.Day) { count--; } return count; } /// /// Получение количества високосных лет, прошедших с конкретной даты /// /// дата /// лист строк високосных лет /// количество високосных лет int GetCountLeapYear(DateTime dateBirth, ref List leapYears) { int count = 0; DateTime now = DateTime.Now; for (int i = dateBirth.Year; i < now.Year; i++) { DateTime current = new DateTime(i, 12, 31); if (current.DayOfYear == 366) { count++; leapYears.Add(current.Year.ToString()); } } return count; } string GetZodiack(DateTime d) { if ((d.Month == 12 && d.Day >= 23) || (d.Month == 1 && d.Day <= 20)) return "Козерог"; if ((d.Month == 1 && d.Day >= 21) || (d.Month == 2 && d.Day <= 19)) return "Водолей"; if ((d.Month == 2 && d.Day >= 20) || (d.Month == 3 && d.Day <= 20)) return "Рыбы"; if ((d.Month == 3 && d.Day >= 21) || (d.Month == 4 && d.Day <= 20)) return "Овен"; if ((d.Month == 4 && d.Day >= 21) || (d.Month == 5 && d.Day <= 21)) return "Телец"; if ((d.Month == 5 && d.Day >= 22) || (d.Month == 6 && d.Day <= 21)) return "Близнецы"; if ((d.Month == 6 && d.Day >= 22) || (d.Month == 7 && d.Day <= 22)) return "Рак"; if ((d.Month == 7 && d.Day >= 23) || (d.Month == 8 && d.Day <= 21)) return "Лев"; if ((d.Month == 8 && d.Day >= 22) || (d.Month == 9 && d.Day <= 23)) return "Дева"; if ((d.Month == 9 && d.Day >= 24) || (d.Month == 10 && d.Day <= 23)) return "Весы"; if ((d.Month == 10 && d.Day >= 24) || (d.Month == 11 && d.Day <= 22)) return "Скорпион"; if ((d.Month == 11 && d.Day >= 23) || (d.Month == 12 && d.Day <= 22)) return "Стрелец"; return ""; } private void Click_Goroscope(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { date = dp.SelectedDate.ToString(); tbGoroscope.IsVisible = true; if (date != "") { DateTime currentDate = DateTime.Now; DateTime dt = Convert.ToDateTime(date); ComboBoxItem selectedItemCB = (ComboBoxItem)cbHoroscope.SelectedItem; if (selectedItemCB.Content == "Знак зодиака хочу") tbGoroscope.Text = $"Ваш знак зодиака: {GetZodiack(dt)}"; if (selectedItemCB.Content == "Восточный гороскоп хочу") { int razn = dt.Year - 1894; tbGoroscope.Text = $"Вы родились в год животного: {ShowAnimal((razn % 12) + 1)}, цвета: {ShowColor((razn % 10) + 1)}"; } if (selectedItemCB.Content == "Не хочу") tbGoroscope.Text = $"Не хотите? Ну и не надо"; } else tbGoroscope.Text = $"Дата не выбрана"; } private void Read_File(object? sender, Avalonia.Interactivity.RoutedEventArgs e) { tbFile.IsVisible = true; if (File.Exists("users.csv")) { List listInfo = new List(); try { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); //Необходимо к нему обратиться, чтобы считать из кодировки 1251 using (StreamReader sr = new StreamReader("users.csv", Encoding.GetEncoding(1251))) { sr.ReadLine(); while (!sr.EndOfStream) { string dateString = sr.ReadLine(); string[] lineArray = Regex.Split(dateString, @"[,;\t\s]{1}"); lineArray[0] = GetNumberDayByName(lineArray[0]); lineArray[1] = GetNumberMonthByName(lineArray[1]); string zodiac = ""; string horoscope = ""; string message = ""; if (lineArray[0] == "" || lineArray[1] == "") zodiac = "Невозможно определить"; if (lineArray[2] == "") horoscope = "Невозможно определить"; // Пытаемся прочитать дату if (TryParseDate(string.Join(" ", lineArray), out DateTime date)) { int razn = date.Year - 1894; zodiac = GetZodiack(date); horoscope = ShowAnimal((razn % 12) + 1); message = "Успешно"; } else { message = "Некорректная дата"; } InfoForGadalka info = new InfoForGadalka(lineArray[0], lineArray[1], lineArray[2], zodiac, horoscope, message); listInfo.Add(info); } } using (StreamWriter sw = new StreamWriter("usersResult.csv", false, Encoding.UTF8)) { sw.WriteLine("День;Месяц;Год;Знак зодиака;Восточный гороскоп;Сообщение"); foreach (InfoForGadalka info in listInfo) { sw.WriteLine($"{info.Day};{info.Month};{info.Year};{info.Zodiac};{info.Horoscope};{info.Message}"); } } tbFile.Text = "Результат сохранен в файле usersResult.csv"; } catch (Exception ex) { tbFile.Text = $"Ошибка при работе с файлом: {ex.Message}"; } } else { tbFile.Text = "Файл users.csv не найден"; } } public static bool TryParseDate(string dateString, out DateTime date) { date = DateTime.MinValue; string[] formats = { "dd.MM.yyyy", // 15.02.1949 "d.MM.yyyy", // 4.09.1999 "dd.M.yyyy", // 15.2.1949 "d.M.yyyy", // 4.9.1999 "d MMMM yyyy", // 2 октябрь 2005 "D MMMM yyyy", "dd MMMM yyyy", "ddd MMMM yyyy", "dddd MMMM yyyy", "d MMMM yyyy", // 2 октября 2005 (с учетом возможного окончания месяца) "MMMM d yyyy", // Октябрь 2 2005 "MMMM d yyyy", // Октября 2 2005 (с учетом возможного окончания месяца) "dd MM yyyy", // 11 11 2005 "d MM yyyy", // 11 11 2005 "d M yyyy", // 11 11 2005 "MM yyyy", // 4 1689 "yyyy", // 1999 }; foreach (string format in formats) { if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { return true; } } return false; } static string GetNumberDayByName(string day) { string[] days = { "первое", "второе", "третье", "четвертое", "пятое", "шестое", "седьмое", "восьмое", "девятое", "десятое", "одиннадцатое", "двенадцатое", "тринадцатое", "четырнадцатое", "пятнадцатое", "шестнадцатое", "семнадцатое", "восемнадцатое", "девятнадцатое", "двадцатое", "двадцать первое", "двадцать второе", "двадцать третье", "двадцать четвертое", "двадцать пятое", "двадцать шестое", "двадцать седьмое", "двадцать восьмое", "двадцать девятое", "тридцатое", "тридцать первое" }; int index = Array.IndexOf(days, day); if (index != -1) return index.ToString(); return day; } static string GetNumberMonthByName(string number) { string[] month = { "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь" }; int index = Array.IndexOf(month, number); if (index != -1) return index.ToString(); return number; } static string ShowColor(int n) { string[] colors = { "Зеленый", "Зеленый", "Красный", "Красный", "Желтый", "Желтый", "Белый", "Белый", "Черный", "Черный" }; if (n > 0 && n < colors.Length) { return colors[n - 1]; } return "Такого нет"; } static string ShowAnimal(int n) { string[] animals = { "Лошадь", "Овца", "Обезьяна", "Петух", "Собака", "Свинья", "Крыса", "Бык", "Тигр", "Кролик", "Дракон", "Змея" }; if (n > 0 && n < animals.Length) { return animals[n - 1]; } return "Такого нет"; } } class InfoForGadalka(string day, string month, string year, string zodiac, string horoscope, string message) { string day = day; string month = month; string year = year; string zodiac = zodiac; string horoscope = horoscope; string message = message; public string Day { get => day; set => day = value; } public string Month { get => month; set => month = value; } public string Year { get => year; set => year = value; } public string Zodiac { get => zodiac; set => zodiac = value; } public string Horoscope { get => horoscope; set => horoscope = value; } public string Message { get => message; set => message = value; } } }