У меня есть приложение, которое читает текстовый файл с датами.
Обратите внимание, что я все еще изучаю С#
содержимое в текстовом файле выглядит примерно так: т.е. я не был отсортирован, но я уже сохранил их в списке и отсортировал по порядку ASC.
02/10/1998
03/10/1998
07/10/1998
10/10/1998
17/10/1998
20/10/1998
Текстовый файл имеет более ста дат, из-за того, что я пользуюсь телефоном, я не могу напечатать весь текст и не могу написать весь код.
в основном цель приложения - записать в новый текстовый файл, содержимое с ** недельными блоками из периода времени, то есть:
Week : Sunday 27 1998 to Saturday 03 1998
Friday 02 1998
Fri 2 98
02/10/98
Saturday 03 1998
Sat 2 98
03/10/1998
Week : Sunday 04 1998 to Saturday 10 1998
Wednesday 07 1998
Wed 7 98
07/10/1998
Saturday 10 1998
Sat 10 98
10/10/1998
//And so on till last date
Выход должен начинаться с первого воскресенья до субботы и заканчиваться последним воскресеньем по субботу.
Все, что мне нужно знать, - как генерировать такой вывод по недельным блокам из разницы?
Я уже написал код для сортировки из списка, и теперь я думаю, что мне приходится разбирать форматы даты
var sortedlist = stulist.OrderBy(s => s.DOB);
DateTime dt = DateTime.ParseExact(line, "ddddMMMMdd", CultureInfo.InvariantCulture);
DateTime dt2 = DateTime.ParseExact(line, "dddMMMd", CultureInfo.InvariantCulture);
DateTime dt3 = DateTime.ParseExact(line, "MM/dd/yyyy", CultureInfo.InvariantCulture);
Я думаю, что мне нужно зацикливаться, но я не могу понять, что указать в моем цикле while.
Любая помощь будет высоко оценена
Какая разница:
tx.WriteLine(dt.ToString("dddd dd yyyy", CultureInfo.InvariantCulture));
есть, если я сохраню ParseExact?
tx.WriteLine(dt);
Ваш вопрос немного запутан. Я пытаюсь повторить то, что вы, вероятно, делаете. Кажется, у вас есть Student
класс, у которого (среди других) поле DOB
. Я предполагаю, что он имеет тип DateTime
. Тогда вы должны сделать что-то вроде этого, чтобы прочитать текстовый файл:
var students = new List<Student>();
string[] lines = File.ReadAllLines("my file path");
CultureInfo southAfricanCuture = new CultureInfo("en-ZA");
foreach (string l in lines) {
DateTime d;
if (DateTime.TryParseExact(l, "dd/MM/yyyy", southAfricanCuture,
DateTimeStyles.AllowWhiteSpaces, out d))
{
students.Add(new Student { DOB = d });
}
}
Мы должны использовать TryParseExact
, чтобы иметь правильный порядок дня и месяца. Но, возможно, я использую неправильную культуру.
Т.е. разбор происходит при преобразовании даты, указанной в тексте, в DateTime
. Чтобы уточнить даты, позже вам придется преобразовать их обратно в string
, форматируя их (не Parsing!).
Чтобы продолжить, нам понадобится этот вспомогательный метод:
public static DateTime FirstDateOfWeek(DateTime date)
{
// Since Sunday = 0 and we want sunday to be the first day of week:
int dayOfWeek = (int)date.DayOfWeek;
return date.AddDays(-dayOfWeek);
}
Теперь давайте создадим блоки даты с помощью LINQ (убедитесь, что вы using System.Linq;
в начале вашего кода):
var dtfi = DateTimeFormatInfo.InvariantInfo;
Calendar cal = dtfi.Calendar;
var dateBlocks = students
.Select(s => s.DOB)
.GroupBy(d => 100 * d.Year +
cal.GetWeekOfYear(d, CalendarWeekRule.FirstDay, DayOfWeek.Sunday))
.OrderBy(g => g.First()); // Order the groups by first date found in them.
И теперь давайте создадим вывод:
foreach (var block in dateBlocks) {
// Week header
DateTime firstDayOfWeek = FirstDateOfWeek(block.First());
DateTime lastDayOfWeek = firstDayOfWeek.AddDays(6);
string weekHeader = String.Format(southAfricanCuture,
"Week : {0:dddd dd/MM yyyy} to {1:dddd dd/MM yyyy}",
firstDayOfWeek, lastDayOfWeek);
Console.WriteLine(weekHeader);
// Week details.
// If the dates appear in wrong order in the input file,
// order the days within the groups.
foreach (DateTime date in block.OrderBy(d => d)) {
Console.WriteLine(date.ToString(" dddd dd/MM yyyy", southAfricanCuture));
Console.WriteLine(date.ToString(" ddd d/M yy", southAfricanCuture));
Console.WriteLine(date.ToString(" dd/MM/yy", southAfricanCuture));
}
}
Console.ReadKey();
Как вы можете видеть, работа с датами - сложный вопрос.
В этом вопросе есть тег linq. Я пытался сделать это в linq
Создать список со значениями
var lst = new List<string> {"02/10/1998",
"03/10/1998",
"07/10/1998",
"10/10/1998",
"17/10/1998",
"20/10/1998"
};
Список значений даты и времени
var DateList = (from value in lst
select DateTime.ParseExact(value, "dd/MM/yyyy",
CultureInfo.InvariantCulture)).ToList();
Позволяет сделать наш список более удобным для использования
List<MyClass> lst3 = DateList.Select(p => new MyClass
{
DT = p,
WeekOfYear = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(p , DateTimeFormatInfo.CurrentInfo.CalendarWeekRule, DayOfWeek.Monday),
FirstDayOfWeek = p.AddDays(DayOfWeek.Monday - p.DayOfWeek),
LastDayOfWeek = p.AddDays(DayOfWeek.Sunday - p.DayOfWeek)
}).OrderBy(x=>x.WeekOfYear).ToList();
Теперь вы можете показать результат
int current_week=-1;
foreach (MyClass o in lst3)
{
if (current_week > o.WeekOfYear)
{
current_week = o.WeekOfYear;
Console.WriteLine("Week: {0} {1} to {2} {3}", o.FirstDayOfWeek.DayOfWeek.ToString() ,o.FirstDayOfWeek, o.LastDayOfWeek.DayOfWeek.ToString(), o.LastDayOfWeek);
}
Console.WriteLine("{0} {1}", o.DT.DayOfWeek.ToString(), o.DT);
}