2010-03-17 159 views
0

功能我已经结构作为:比较的日期

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“储存”。

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

我不太清楚什么是排序这些日子的好方法?将它们比较为c字符串?

+0

“ctr”代表什么? – John 2010-03-17 22:49:22

+0

日期(日)(dd),月(MMM),年(yyyy)的格式是否始终相同? – 2010-03-17 22:50:43

+0

ctr基本上只是一个计数器 - 不需要 – Chris 2010-03-17 22:53:19

回答

0

你不能将它们比作字符串,但你可以比较子字符串。比较几年,如果不相等,你有你的答案。接下来比较几个月,您需要某种表格来按名称排列月份。最后,如果月份相同,则比较日期。

1

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

year * 10000 + month * 100 + day; 

,然后做一个简单的数字比较(和月,你需要映射二月从一月到1,2,等)。

如果您正在进行大量比较,则可能需要在结构中缓存等效数字。

1

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

1

ISO 8601格式化日期(“YYYYMMDD”或“YYYY-MM-DD”等)与C字符串一样可比。你的格式不是 - 会改变日期字符串的格式吗?

PS:如果你摆脱了“ - ”,你甚至可以将日期存储为普通的32位整数。根据您的应用程序对这些日期的处理,这可能是额外的好处。

+0

是的,将它改为YYYY-MM-DD绝对是一种可能。 – Chris 2010-03-17 23:03:45

+0

这有很好的副作用,ISO 8601符号是国际性的(没有英文月份名称)*和*唯一明确的数字符号(我知道)。我会去的。 – DevSolar 2010-03-18 08:07:50