目前,我正在使用 DateTime.Now.ToLongDateString()
来设置日期属性,尽管我想更详细地了解日期。目的是根据项目的日期执行排序,当前将给出格式为 2013 年 7 月 4 日星期四
的日期。如果多个项目在同一天具有相同的日期属性,则不会执行排序。 DateTime.Now 是否有一个函数允许带有秒的日期属性?
需要注意的是,仍然必须包含日期和年份,因为排序可能会在几天内或几年内进行,但同一天也可能有该项目的多个实例。您有什么建议,或者有更好的方法来解决这个问题吗?此外,这必须适用于任何文化和任何时区。
编辑
在我的主页中,我使用一组图片填充名为Recent
的列表框。在我的“设置”页面中,用户可以选择升序或降序排序顺序,并且基于此,在填充列表框之前必须对集合进行相应排序。
MainPage.xaml.cs
protected override void OnNavigatedTo(NavigationEventArgs e)
{
ObservableCollection<Selfie.Models.Picture> listItems = new ObservableCollection<Selfie.Models.Picture>(PictureRepository.Instance.Pictures);
if (Settings.AscendingSort.Value)
{
listItems.OrderBy(x => x.DateTaken);
Recent.ItemsSource = listItems;
}
else
{
listItems.OrderByDescending(x => x.DateTaken);
Recent.ItemsSource = listItems;
}
}
我有一个类,将日期时间序列化和反序列化为图片的属性,该类应用于我试图排序的DateTaken
。
最佳答案
编辑2
好的,
您需要使用OrderByDescending
函数的结果。
// listItems remains unaffected.
var sorted = listItems.OrderByDescending();
许多函数,尤其是作用于具有一定程度的不变性的结构的扩展,不会影响源。纯函数应该以“流畅”的方式使用。返回值需要赋值才能使用。
所以,你需要这样做,
Recent.ItemsSource = listItems.OrderBy(x => x.DateTaken).ToList();
值得考虑像 Resahrper 这样的工具捕捉这样的问题。他们是common with the DateTime
Add
functions .
编辑
因为您在多文化环境中工作,所以请确保所有日期均以 UTC 类型实例化和存储,这将对您有很大帮助。即使在单一时区工作,但跨夏令时边界排序。
使用 DateTime.UtcNow
代替 DateTime.Now
,并将所有值保留为 UTC DateTime
,直到它们导出或显示在 GUI 上.
这样您就可以将苹果与苹果进行比较,并且您的排序将按预期进行,并且您的数据将更容易调试。
如果您开始做任何复杂的事情,您将发现 .Nets DateTime
实现中的漏洞。它正在考虑使用 Jon Skeet 和其他人在 noda time 上的工作这应该克服许多陷阱。
这不适用于跨时区、日历或仅适用夏令时
如果出于某种原因您确实需要可排序的String
,请使用 DateTime.Now.ToString("o");
这将生成一个往返格式的字符串,
yyyy-MM-ddTHH:mm:ss.fffffff
它可以很好地排序,包括小数部分。假设所有值都来自相同的时区和日历。
关于c# - 如何使用 DateTime.Now 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474822/