【问题标题】:How to Use DateTime.Now function如何使用 DateTime.Now 函数
【发布时间】:2013-07-02 17:26:40
【问题描述】:

目前我正在使用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,我正在尝试对其进行排序。

【问题讨论】:

  • 你有什么理由使用字符串而不是直接操作DateTime
  • 如果你得到一个包含秒的字符串,同一秒的值会发生什么?不同时区的日期呢?
  • 我已将 DateTaken 属性从字符串类型保存为 DateTime 类型。但是,我确实希望不包括时区,因为用户可能在不同的时区,我希望严格根据 DateTime 属性执行排序。
  • @Matthew 您始终可以将 DateTime 存储为 UTC DateTime。见msdn.microsoft.com/en-us/library/…
  • 使用u 格式说明符的msdn.microsoft.com/en-us/library/az4se3k1.aspx#Roundtrip 怎么样?这有什么不同?

标签: c# sorting datetime


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    您也可以设置日期格式,但您选择显示,但通常最好在内部存储实际的DateTime

    【讨论】:

    • +1 因为这将是最理想的解决方案,因为该类型已经支持它。字里行间读得真好!
    • 我想不出一个现实的非典型场景,但我猜有些人“知道得更好”。 DateTimes IComparable 实现肯定会超越基于字母数字巧合的任何事物。
    【解决方案3】:

    编辑 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 DateTimes,直到它们被导出或显示在 GUI 上。

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


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


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

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

    yyyy-MM-ddTHH:mm:ss.fffffff

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

    【讨论】:

    • "o" 在这种情况下究竟做了什么?我确实需要一个可排序的字符串,因为我正在根据 DateTime 参数对集合中的项目进行排序,我将其保存为 IsolatedStorage 中的字符串。仅使用DateTime.Now.ToString() 就给出了一个字符串,但排序仍然不起作用。
    • @Matthew,正如我在回答开头所说的那样,直接对 DateTime 结构进行排序比直接转换为字符串并依赖字母数字比较更有效、更简单。 IComparableDateTime 实现被适当地专门化了。
    • 我确实将我的 DateTime 从字符串保存为 DateTime 格式,尽管在 DateTaken 属性(DateTime 类型)上执行 listItems.OrderByDescending(x =&gt; x.DateTaken); 不会更改排序顺序?
    • 哪些值是乱序的?您应该修改问题,以便我们都能获得帮助。
    【解决方案4】:

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

    例如:-

    var foo = collection.OrderBy(d => d.Date);
    

    【讨论】:

    • @ReedCopsey 迂腐?你完全知道我的意思。还是编辑了。
    • 我没有对你投反对票 - 但确实提到了它,因为它实际上是论坛等上相当普遍的问题 - 新用户通常希望有一个“仅限日期”类型;)
    【解决方案5】:

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

    stackoverflow.com/questions/9814060/...

    由于它只是一个 long,因此您可以轻松对其进行排序,也可以将其存储在 string 或 long 中。

    【讨论】:

      【解决方案6】:

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

      date.ToString("YYYYMMddHHmmss")
      

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 将字符串转换为 dateTime 以便您排序
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-19
          • 1970-01-01
          • 1970-01-01
          • 2019-05-17
          相关资源
          最近更新 更多