目前我正在使用DateTime.Now.ToLongDateString()
来设置日期属性,尽管我希望在日期中更加详细。目的是根据项目的日期执行排序,目前这将以Thursday, July 4, 2013
格式给出日期。如果多个项目在同一天具有相同的日期属性,则不执行排序。是否有DateTime.Now函数允许日期属性为秒?
要注意,仍然必须包含日期和年份,因为排序可能会在几天内,几年内发生,但在同一天可能还有几个项目实例。你会建议什么建议,或者有更好的方法来解决这个问题?此外,这必须适用于任何文化和任何时区。
修改
在我的MainPage中,我使用一组图片填充名为Recent
的ListBox。在我的“设置”页面中,用户可以选择升序或降序排序,基于此,必须在填充列表框之前对集合进行相应的排序。
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;
}
}
我有一个类将SerialTime序列化和反序列化为Picture的属性,该属性应用于DateTaken
,我试图按其排序。
答案 0 :(得分:2)
直接使用DateTime
对象。它会为您提供足以进行排序的日,月,年,小时,分钟,秒。
例如: -
var foo = collection.OrderBy(d => d.Date);
答案 1 :(得分:1)
直接按DateTime.Now
排序,而不转换为字符串。如果您将DateTime
直接存储在您的媒体资源中,则不会出现问题。
DateTime
类型支持日期和时间到刻度线。
您也可以格式化日期,但选择进行显示,但通常最好在内部存储实际的DateTime
。
答案 2 :(得分:1)
编辑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类型存储,这将对您有所帮助。即使在单个时区工作,但在Day Light Saving Time boundries中进行排序。
而不是DateTime.Now
使用DateTime.UtcNow
并将所有值保留为UTC DateTime
,直到它们被导出或显示在GUI上。
通过这种方式,您可以将苹果与苹果进行比较,您的排序将按预期工作,您的数据将更容易调试。
如果你开始做任何复杂的事情,你会发现.Nets DateTime
实施中的裂缝。它正在考虑使用Jon Skeet和其他人在noda time上的工作,这应该可以克服许多陷阱。
这不适用于时区,日历或仅限日间节能
如果由于某种原因确实需要可排序的 String
,请使用DateTime.Now.ToString("o");
这样就会以往返格式生成一个字符串,
YYYY-MM-DDTHH:MM:ss.fffffff
可以很好地排序,包括小数部分。假设所有值都来自相同的时区和日历。
答案 3 :(得分:0)
DateTime.Now.ToString()
方法会为您提供一个包含所有内容的字符串。
但正如@SimonBelanger指出的那样,你应该直接在DateTime上排序,而不是在字符串表示上。
答案 4 :(得分:0)
如果需要序列化日期,而不是只对DateTime对象进行排序,可以尝试将其转换为unix时间(自Unix Epoch开始以来的毫秒数)。
stackoverflow.com/questions/9814060/...
由于它只是一个很长的时间,你可以轻松地对它进行排序,也可以将它存储在一个字符串中或长或任何其他内容。
答案 5 :(得分:0)
如果您可以按照Reed声明的那样直接按DateTime排序。但是,如果你不能,你会想要以非常具体的方式将其串起来。也许是这样的:
date.ToString("YYYYMMddHHmmss")
因为要以字符方式对日期进行排序,您需要按正确的顺序对日期的各个部分进行排序。
答案 6 :(得分:0)
您可以使用DateTime.Now.ToString("YYYYMMddHHmmss")
或DateTime.Now.Ticks
答案 7 :(得分:0)
如果您添加此段代码DateTime.Now.ToString();
,则会打印7/4/2013 10:05:18 PM
,
如果您添加string time = DateTime.Now.ToString("hh-mm-ss");
,则会打印(10-07-36)
。
在tostring方法中,您可以根据您的要求设置日期格式。