2011-05-10 28 views

cevap

5

Ben time_t değerlerine difftime kullanmak ve bir hafta içinde saniye sayısı karşılaştırmak istiyoruz ...

+0

öylesine nasıl dize bugünkü date.and karşılaştırmak için bir time_t değişkeni "2010-11-10" dize dönüştürebilirsiniz ve ayrıca bir dosyanın – quartaela

+0

bir kişinin doğum günü dize okuyorum değerleri "bir struct tm' ve sonra 'time_t' değerini almak için' mktime''ı kullanın. Sadece kullanılmayan alanların 0'a kadar temizlendiğinden emin olun. –

+0

iyi arkadaşım sanırım bu mktime bu kişinin hangi gün doğduğunu gösterecektir. ama programın yürütüldüğü zaman kişinin doğum gününün 7 gün içinde yaklaşması gerekiyor. – quartaela

1

doğum tarihi ile yapı tm doldurma ve bir time_t bu dönüştürün.

Geçerli time_t öğesini time() kullanarak alın.

Bir hafta 86400 * 7 saniyedir.

Doğum tarihi time_t ile geçerli time_t arasındaki farkı kontrol edin.

+0

, bu nedenle günümüzün tarihini karşılaştırmak için bir time_t değişkenindeki "2010-11-10" dizesini nasıl dönüştürebilirim. ve ayrıca bir kullanıcının doğum günü dizesini bir dosyadan okuyorum. – quartaela

2

struct tm dizesini dönüştürmek için strptime işlevini istiyorsunuz. Posix'in bir parçası, ama C standardı değil. http://www.cs.potsdam.edu/cgi-bin/man/man2html?3+strptime, strptime kullanım kılavuzuna sahiptir. giriş tarihi önümüzdeki hafta içinde ise

Daha sonra, tm_mday alana 7 eklemek bir time_t (mktime ile) sonucu dönüştürmek ve sonra (time(NULL) itibaren) geçerli zamana karşılaştırmak, böylece görmek istiyorum .

C standardı uyarınca, time_t değerlerinde aritmetik yapmak için taşınabilir değildir, bu nedenle, bunun yerine struct tm alanlarını değiştirmeniz gerekir. Benzer şekilde, difftime'u kullanarak mevcut zamanla karşılaştırmayı yapmanız gerekir.

3

Aşağıdaki örnek program, argüman satırındaki belirli bir dizeyi gün sayısına dönüştürür. Örnek çıktı:

% ./nd 2011-06-18 1971-02-10 invalid 2010invalid 
38 days 
-14699 days 
2147483647 days 
2147483647 days 

Düzenleme: -1 bunun yerine INX_MAX kullanarak güzel bir başarısızlık göstergesi olmadığını karar verdi.

#include <sys/param.h> 
#include <time.h> 
#include <string.h> 
#include <stdio.h> 

#define ONE_DAY (24 * 3600) 

int main(int argc, char *argv[]) 
{ 
     int i; 

     if(argc < 2) 
       return (64); // EX_USAGE 

     for(i=1; i < argc; i++) 
     { 
       time_t res; 

       res = num_days(argv[i]); 
       printf("%d days\n", res); 
     } 

     return(0); 
} 

int num_days(const char *date) 
{ 
     time_t now = time(NULL); 
     struct tm tmp; 
     double res; 

     memset(&tmp, 0, sizeof(struct tm)); 
     if(strptime(date, "%F", &tmp) == NULL) 
       return INT_MAX; 

     res = difftime(mktime(&tmp), now); 
     return (int)(res/ONE_DAY); 
} 
+0

dostum ne yaptın: D. "#include " adlı kitap hiç kullanılmamıştı. ve neden memset_ kullanıyoruz? "2010-11-25" yi deneyin ve bu dizgiyi time_h değişkenine dönüştürün ve sonucu şimdi karşılaştırın. ( eğer; sonuç çıktı 7'den daha küçük veya eşitse bu yüzden olacak ve hangi "int main (int argc, char * argv []) { int i "onun doğum günü yaklaşık 7 gündür" argc <2) dönüş (64); // EX_USAGE " bu program yürütme_ için bir kontrol mekanizmasıdır? – quartaela

+0

sys/param.h sistem için parametreler içerir.Diğerleri arasında, bir tamsayı türünün tutabileceği maksimum değer olan INT_MAX'ı tanımlar. Ayrıca, bir yolun sahip olabileceği maksimum uzunluk olan MAXPATHLEN'i de tanımlar. Ve evet, eğer num_days sonucu> 0 ve <= 7 ise, o zaman "Kullanıcı bir hafta içinde bir doğum gününe sahiptir!" Diyebilirsiniz. Ah ve ben memset kullanırız, çünkü strptime sadece biçim dizgisinde belirtilen struct tm bölümlerini doldurur, bu yüzden memset undefined parçaların şimdi 0 olarak tanımlandığından emin olur. – Mel

+0

ben sadece test için kod yapıştırın kopyalayın ve bir hata verir "newfile.c: 37: 40: uyarı: işaretçi ve tamsayı arasındaki karşılaştırma" satırı için "if (strptime (tarih,"% F ", & tmp) == NULL)" _ ?. – quartaela

İlgili konular