【问题标题】:compare function for dates日期比较功能
【发布时间】:2010-03-17 22:45:55
【问题描述】:

我的结构为:

struct stored
{
    char *dates; // 12/May/2010, 10/Jun/2010 etc..
};
// const
struct stored structs[] = {{"12/May/2010"}, {"12/May/2011"}, 
                           {"21/May/2009"}, {"13/May/2011"}, 
                           {"10/May/2011"}, {"19/May/2011"}};

我想要做的是按stored.dates 对struct 'stored' 进行排序。

qsort(structs, 9, sizeof(struct stored*), sortdates); // sortdates function

我不太确定这些日子有什么好办法?将它们作为 c 字符串进行比较?

【问题讨论】:

  • 日期的格式——日(dd)、月(MMM)、年(yyyy)——总是一样的吗?
  • ctr 基本上只是一个计数器 - 不需要
  • 格式总是一样的

标签: c date cstring


【解决方案1】:

我会使用类似的方法将日期转换为数字:

year * 10000 + month * 100 + day;

然后进行简单的数字比较(对于月份,您需要映射从一月到 1 日、二月到 2 日等)。

如果您要进行大量比较,您可能希望在结构中缓存数字等价物。

【讨论】:

    【解决方案2】:

    如果将日期转换为YYYYMMDD 格式(如20100314),则可以将它们作为字符串或整数进行比较(转换后)。

    【讨论】:

      【解决方案3】:

      ISO 8601 格式的日期(“YYYYMMDD”或“YYYY-MM-DD”等)与 C 字符串非常相似。您的格式不是 - 可以选择更改日期字符串的格式吗?

      PS:如果去掉“-”,您甚至可以将日期存储为纯 32 位整数。根据您的应用程序对这些日期的处理方式,这可能是额外的奖励。

      【讨论】:

      • 这有一个很好的副作用,即 ISO 8601 表示法既是国际的(没有英文月份名称)也是唯一明确的数字表示法(据我所知)。我会去的。
      【解决方案4】:

      您不能将它们作为字符串进行比较,但可以比较子字符串。比较年份,如果它们不相等,你就有答案了。接下来比较月份,您需要某种表格来按名称对月份进行排序。最后,如果月份相同,请比较日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2018-11-24
        • 1970-01-01
        相关资源
        最近更新 更多