简体   繁体   中英

.Where(Date.AddHours) filter doesn't seem to work

I'm sorting a list of files that was created from yesterday 1:00pm to present time. I'm trying to use the following code: The messagebox shows the correct time I'm trying to reference, but the filter doesn't seem to work. If I remove the "AddHours(13)" it does filter correctly.

MessageBox.Show(DateTime.Now.Date.AddDays(-1).AddHours(13).ToString());
string[] files = Directory.GetFiles(FBD.SelectedPath, "*.xls")
    .Where(file => new FileInfo(file).CreationTime.Date >= (DateTime.Now.Date.AddDays(-1).AddHours(13)) && file.Contains("AA"))
    .OrderBy(file => new FileInfo(file).CreationTime.Date)
    .ToArray(); 

What am I missing?

DateTime.Now.Date.AddDays(-1).AddHours(13) will return 1pm... but you're checking against new FileInfo(file).CreationTime.Date , which is always at midnight... for a file created yesterday, it will be yesterday at midnight.

So yes, you're filtering out that file. If you remove the .Date part from new FileInfo(file).CreationTime that may well be all you need to do.

As a side-note, I'd use DateTime.Today instead of DateTime.Now.Date , and I'd also try to avoid evaluating it multiple times. I'd also use DirectoryInfo and stick to FileInfo entries given that you're already creating those twoce. I'd rewrite your query as something like:

var cutoff = DateTime.Today.AddDays(-1).AddHours(13);
FileInfo[] files = new DirectoryInfo(FBD.SelectedPath).GetFiles("*.xls")
    .Where(file => file.CreationTime >= cutoff)
    .OrderBy(file => file.CreationTime)
    .ToArray();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM