2

目前我正在使用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;
        }
   }

我有一个类将 DateTime 序列化和反序列化为图片的属性,该属性应用于DateTaken我试图排序的 。

4

8 回答 8

2

直接使用DateTime对象即可。它会为您提供足以进行排序的日、月、年、小时、分钟、秒。

例如: -

var foo = collection.OrderBy(d => d.Date);
于 2013-07-04T16:29:29.907 回答
1

只需直接排序DateTime.Now,无需转换为字符串。如果您将其DateTime直接存储在您的财产中,这将不是问题。

DateTime类型支持精确到刻度的日期和时间。

您也可以根据您选择的显示日期来格式化日期,但通常最好在内部存储实际的DateTime.

于 2013-07-04T16:28:53.843 回答
1

编辑 2

好的,

您需要使用OrderByDescending函数的结果。

// listItems remains unaffected.
var sorted = listItems.OrderByDescending();

许多功能,尤其是作用于具有一定程度不变性的结构的扩展,不会影响源。纯函数应该以“流利”的风格使用。需要分配返回值才能使用。

所以,你需要做的是,

Recent.ItemsSource = listItems.OrderBy(x => x.DateTaken).ToList();

值得考虑使用像Resahrper这样的工具来捕获此类问题。它们DateTime Add函数通用。


编辑

因为您在多文化环境中工作,所以请确保您的所有日期都以 UTC 类型进行实例化和存储,这将对您有很大帮助。即使在单个时区工作但跨夏令时边界进行排序。

而不是DateTime.Now使用DateTime.UtcNow并将所有值保留为 UTC DateTime,直到它们被导出或呈现在 GUI 上。

通过这种方式,您将苹果与苹果进行比较,您的排序将按预期工作,并且您的数据将更容易调试。


如果你开始做任何复杂的事情,你就会发现 .NetsDateTime实现的漏洞。它正在考虑使用 Jon Skeet 和其他人在noda time上的工作,这应该可以克服许多坑。


这不适用于跨时区、日历或仅适用于夏令时

如果您String出于某种原因确实需要一个可排序的,请使用 DateTime.Now.ToString("o");它以往返格式生成一个字符串,

yyyy-MM-ddTHH:mm:ss.fffffff

这是很好的排序,包括小数部分。假设所有值都来自相同的时区和日历。

于 2013-07-04T16:29:05.780 回答
0

DateTime.Now.ToString()方法将为您提供一个包含所有内容的格式化字符串。

但正如@SimonBelanger 指出的那样,您可能应该直接在 DateTime 上排序,而不是在字符串表示上。

于 2013-07-04T16:28:47.750 回答
0

如果您需要序列化日期,而不是仅对 DateTime 对象进行排序,您可以尝试将其转换为 unix 时间(自 Unix 纪元开始以来的毫秒数)。

stackoverflow.com/questions/9814060/...

由于它只是很长,您可以轻松地对其进行排序,也可以将其存储在字符串或 long 或其他任何内容中。

于 2013-07-04T16:31:02.863 回答
0

如果您可以按照 Reed 的说明直接按 DateTime 排序,请执行此操作。但是,如果你不能,你会想用一种非常具体的方式把它串起来。也许是这样的:

date.ToString("YYYYMMddHHmmss")

因为要以字符方式对日期进行排序,您需要以正确的顺序对日期的各个部分进行排序。

于 2013-07-04T16:33:11.600 回答
0

您可以使用DateTime.Now.ToString("YYYYMMddHHmmss")DateTime.Now.Ticks

于 2013-07-04T16:34:00.270 回答
0

如果您添加这段代码DateTime.Now.ToString(); ,它将打印7/4/2013 10:05:18 PM,如果您添加string time = DateTime.Now.ToString("hh-mm-ss"); ,它将打印(10-07-36)。在 tostring 方法中,您可以根据您的要求格式化日期。

于 2013-07-04T16:39:18.047 回答