我有一个应用程序,它读取带有日期的文本文件。
请注意我还在学习C#
文本文件中的内容是这样的: ,即我的内容未排序,但我已将它们存储在列表中并按ASC顺序排序。
02/10/1998
03/10/1998
07/10/1998
10/10/1998
17/10/1998
20/10/1998
文本文件有更多的100个日期,因为我使用的是手机,我无法输入所有文字,也无法写入整个代码。
基本上,应用程序的目的是写入一个新的文本文件,内容包含来自时间跨度的**周块 即:
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);
答案 0 :(得分:2)
你的问题有点令人困惑。我试着概括一下你可能在做什么。您似乎有一个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
。
继续,我们需要这个辅助方法:
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();
如您所见,使用日期是一件复杂的事情。
答案 1 :(得分:1)
这个qwestion中有一个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);
}