【问题标题】:Min Date and Max date最小日期和最大日期
【发布时间】:2012-07-04 07:53:58
【问题描述】:

我有如下日期列表

 List<string> nameList = new List<string>();
 nameList.Add("20120618PM");
 nameList.Add("20120622PM");
 nameList.Add("20120622AM");
 nameList.Add("20120628PM");
 nameList.Add("20120702PM");
 nameList.Add("20120629AM");
 nameList.Add("20120629PM");

我想从列表中找到 MAXDATE 和 MIN DATE。请告诉我如何继续。

问候,
钱娜

【问题讨论】:

  • 你有一个字符串列表,你的第一个问题是将它们转换为日期。它们似乎是进一步区分上午或下午的日期。如果您可以定义如何将strings 解析为DateTimes,那么这是一个微不足道的问题。我可以看到几个合乎逻辑的可能性。
  • 对日期使用比字符串更好的数据类型,应该很容易。
  • 格式是什么?是 YYYYMMDD 还是 Year with Time ?
  • @Channa 这个问题有很多活动;但@Default 的问题旨在推动提出一个好的 SO 问题。目前,您的问题基本上是 - “这里有一些数据,给我一些代码”,而没有任何关于您所做工作的信息。您可能不知道有任何方法可以做到这一点,但我猜您是一名 .Net 开发人员,您知道DateTime,因此您尝试做某事是合理的有了这个,或者至少你遇到了一个你不能的原因。您应该包含该信息。
  • @Andras:当然,谢谢,我会包括在内。我尝试过的。

标签: c#


【解决方案1】:

那是什么格式? "yyyyMMddtt"?

有带日期的 AM PM。没有时间陪上午/下午。所以我假设上午是 00:00:00,下午是 12:00:00

首先纠正你的格式,然后使用它

List<DateTime> temp = nameList.Select(x => 
DateTime.ParseExact(x, "yyyyMMddtt", CultureInfo.InvariantCulture)).ToList();

然后

temp.Min("yyyyMMddtt");

temp.Max("yyyyMMddtt");

【讨论】:

  • 我想也许ParseExact? ToString 也需要 tt 而不是 PM
  • 此外,“PM”不会以“PM”的形式出现,而是“P”{月数}。
【解决方案2】:

如果日期格式是 yyyyMMdd,那么即使是 AM/PM,它也可以作为字符串排序

 nameList.Max()

如果您有一年加小时/分钟和上午/下午,那么您必须解析为 DateTime。正如其他答案中所建议的那样,我建议无论如何都进行解析。

【讨论】:

  • 是的。添加了关于此的注释。 (需要 24 小时,而不是上午/下午)。附带说明,应禁止不可排序的日期格式;)
  • 事实上,我认为它是可排序的,因为它是 yyyyMMdd,所以 AM 在任何给定日期都在 PM 之前。所以我原来的公式实际上是成立的。
  • 好吧——实际上我们的编码器需要使用DateTimes!
  • @AndrasZoltan 我同意。该示例应使用 DateTime。但是,如果已经有一个文本可排序格式的日期列表,则无需解析为 DateTime 仅 fr 排序。事实上,我什至不确定这个 Dateformat 是否可以解析? “20120705PM”(7 月 5 日下午)在 DateTime 中的表示形式是什么。您需要按照其他答案中的建议手动拆分/解析,然后对生成的 DateTime 对象进行排序。我说只要对字符串进行排序就可以了。
  • 是的,这是一个很好的观点。我刚刚意识到我的 -1 是没有根据的......因为它是月日早晨/avo。所以我把它变成了+1。上帝啊,字符串格式太可怕了!
【解决方案3】:
// 1. Convert your string list to datetimes  
IEnumerable<DateTime> dates = nameList.Select(m => DateTime.Parse(m, yourFormatProvider));

// 2. Get first and last date
DateTime maxDate = dates.Max();
DateTime minDate = dates.Min();

【讨论】:

  • 我不认为你可以Union 一个DateTime 和另一个DateTime
  • @Rawling 很抱歉你是对的。我太快了,我已经改变了它。谢谢
  • 为什么新建Listnew[] { dates.Max(), dates.Min() }更好?或者,更好的是 - var min = dates.Min(); var max = dates.Max(); 还有一个关于字符串解析的问题 - DateTime.Parse 不会解析这些字符串。 ParseExact 更好。
【解决方案4】:

如果我必须猜的话,我似乎猜到了。我会这样做

var dates = nameList.ConvertAll(s => {
        var dateString = s.SubString(6);
        var timeString = s.SubString(7, 2);

        var date = DateTime.Parse(dateString);

        if (timeString == "PM")
        {
           date = date.AddHours(12);
        }

        return date;
    });

var max = date.Max();
var min = date.Min();

【讨论】:

    【解决方案5】:

    由于您在评论中将格式指定为yyyyMMdd,因此您需要从字符串中删除PMAM

    List<DateTime> dateList = 
      nameList.Select(x =>
      DateTime.ParseExact(
                          x.TrimEnd("PM".ToCharArray()).TrimEnd("AM".ToCharArray()), 
                         "yyyyMMdd", 
                          CultureInfo.InvariantCulture)
                          ).ToList();
    
                var Minimum = dateList.Min();
                var Maximum = dateList.Max();
                Console.WriteLine(Minimum.ToString());
                Console.WriteLine(Maximum.ToString());
    

    这会给你:

    2012 年 6 月 18 日上午 12:00:00
    2012 年 7 月 2 日上午 12:00:00

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2013-11-29
      • 2012-09-05
      • 2019-08-17
      • 1970-01-01
      相关资源
      最近更新 更多