times.c

来自「网络爬虫程序」· C语言 代码 · 共 336 行

C
336
字号
/***************************************************************************//*    This code is part of WWW grabber called pavuk                        *//*    Copyright (c) 1997 - 2001 Stefan Ondrejicka                          *//*    Distributed under GPL 2 or later                                     *//***************************************************************************/#include <time.h>#include <string.h>#include <stdio.h>#include <errno.h>#include "config.h"#include "tools.h"#include "times.h"typedef struct _dayn{  char *name;  int dayn;} dayn;static dayn dnames[] = {  {"Sun", 0},  {"Mon", 1},  {"Tue", 2},  {"Wed", 3},  {"Thu", 4},  {"Fri", 5},  {"Sat", 6},  {"Sunday", 0},  {"Monday", 1},  {"Tuesday", 2},  {"Wednesday", 3},  {"Thursday", 4},  {"Friday", 5},  {"Saturday", 6},};static dayn mnames[] = {  {"Jan", 0},  {"Feb", 1},  {"Mar", 2},  {"Apr", 3},  {"May", 4},  {"Jun", 5},  {"Jul", 6},  {"Aug", 7},  {"Sep", 8},  {"Oct", 9},  {"Nov", 10},  {"Dec", 11},  {"January", 0},  {"February", 1},  {"March", 2},  {"April", 3},  {"May", 4},  {"Jun", 5},  {"July", 6},  {"August", 7},  {"September", 8},  {"October", 9},  {"November", 10},  {"December", 11},};#ifndef HAVE_GMTOFFstatic long difftm(struct tm *, struct tm *);#endif/**************************//* make copy of struct tm *//**************************/struct tm *new_tm(struct tm *t){  struct tm *tn;  if(!t)    return NULL;  tn = _malloc(sizeof(struct tm));  memcpy((char *) tn, (char *) t, sizeof(struct tm));  return tn;}/************************//* scan GMT time string *//************************/time_t scntime(char *timestr){  char *pom = new_string(timestr);  int i;  char *p;  struct tm otm;  time_t rv;  int ilen;  bool_t last = 1;  memset((void *) &otm, '\0', sizeof(otm));  otm.tm_isdst = -1;  p = pom;  p += strspn(p, ", -:");  ilen = strcspn(p, ", -:");  if(*(p + ilen))    *(p + ilen) = '\0';  else    last = 0;  if(!*p)    return 0L;  for(i = 0; i < NUM_ELEM(dnames); i++)  {    if(!strcasecmp(p, dnames[i].name))    {      otm.tm_wday = dnames[i].dayn;      break;    }  }  if(!(i < NUM_ELEM(dnames)))    return 0L;#define NEXT_TOKEN \  p += ilen+last;\  p += strspn(p , ", -:");\  ilen = strcspn(p , ", -:");\  if (*(p+ilen)) *(p+ilen) = '\0';\  else last = 0;\  NEXT_TOKEN;  otm.tm_mday = _atoi(p);  if(errno == ERANGE)  {    for(i = 0; i < NUM_ELEM(mnames); i++)    {      if(!strcasecmp(p, mnames[i].name))      {        otm.tm_mon = mnames[i].dayn;        break;      }    }    if(!(i < NUM_ELEM(mnames)))      return 0L;    NEXT_TOKEN;    otm.tm_mday = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_hour = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_min = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_sec = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_year = _atoi(p);    if(errno == ERANGE)      return 0L;    otm.tm_year = (otm.tm_year > 1900) ? otm.tm_year - 1900 : otm.tm_year;  }  else  {    NEXT_TOKEN;    for(i = 0; i < NUM_ELEM(mnames); i++)    {      if(!strcasecmp(p, mnames[i].name))      {        otm.tm_mon = mnames[i].dayn;        break;      }    }    if(!(i < NUM_ELEM(mnames)))      return 0L;    NEXT_TOKEN;    otm.tm_year = _atoi(p);    if(errno == ERANGE)      return 0L;    otm.tm_year = (otm.tm_year > 1900) ? otm.tm_year - 1900 : otm.tm_year;    NEXT_TOKEN;    otm.tm_hour = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_min = _atoi(p);    if(errno == ERANGE)      return 0L;    NEXT_TOKEN;    otm.tm_sec = _atoi(p);    if(errno == ERANGE)      return 0L;  }  rv = mktime(&otm);#ifdef HAVE_GMTOFF  rv += otm.tm_gmtoff;#else  {    struct tm *gt, *lt;    LOCK_TIME;    lt = new_tm(localtime(&rv));    gt = new_tm(gmtime(&rv));    UNLOCK_TIME;    rv += difftm(lt, gt);    free(lt);    free(gt);  }#endif  free(pom);  return rv;}/**********************************************//* parse time string in format YYYYMMDDHHmmss *//**********************************************/time_t time_ftp_scn(char *timestr){  char pom[10];  struct tm ftm;  time_t rv;  memset((void *) &ftm, '\0', sizeof(ftm));  ftm.tm_isdst = -1;  strncpy(pom, timestr, 4);  *(pom + 4) = '\0';  ftm.tm_year = _atoi(pom) - 1900;  strncpy(pom, timestr + 4, 2);  *(pom + 2) = '\0';  ftm.tm_mon = _atoi(pom) - 1;  strncpy(pom, timestr + 6, 2);  *(pom + 2) = '\0';  ftm.tm_mday = _atoi(pom);  strncpy(pom, timestr + 8, 2);  *(pom + 2) = '\0';  ftm.tm_hour = _atoi(pom);  strncpy(pom, timestr + 10, 2);  *(pom + 2) = '\0';  ftm.tm_min = _atoi(pom);  strncpy(pom, timestr + 12, 2);  *(pom + 2) = '\0';  ftm.tm_sec = _atoi(pom);  rv = mktime(&ftm);#ifdef HAVE_GMTOFF  rv += ftm.tm_gmtoff;#else  {    struct tm *gt, *lt;    LOCK_TIME;    lt = new_tm(localtime(&rv));    gt = new_tm(gmtime(&rv));    UNLOCK_TIME;    rv += difftm(lt, gt);    free(lt);    free(gt);  }#endif  return rv;}time_t time_scn_cmd(char *timestr){  time_t t = 0;  struct tm ftm;  if(sscanf(timestr, "%d.%d.%d.%d:%d", &ftm.tm_year, &ftm.tm_mon,      &ftm.tm_mday, &ftm.tm_hour, &ftm.tm_min) == 5)  {    ftm.tm_year = ftm.tm_year - 1900;    ftm.tm_mon -= 1;    ftm.tm_isdst = -1;    ftm.tm_sec = 0;    t = mktime(&ftm);  }  return t;}#ifndef HAVE_GMTOFF/************************************************************************//*   this function I steal from gettext-0.10.35/src/xgettext.c    *//*      here is copyright         *//*   copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.*//*   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, April 1995.    *//************************************************************************/#define TM_YEAR_ORIGIN 1900/* Yield A - B, measured in seconds.  */static long difftm(struct tm *a, struct tm *b){  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);  /* Some compilers cannot handle this as a single return statement.  */  long days = (    /* difference in day of year  */    a->tm_yday - b->tm_yday    /* + intervening leap days  */    + ((ay >> 2) - (by >> 2))    - (ay / 100 - by / 100) + ((ay / 100 >> 2) - (by / 100 >> 2))    /* + difference in years * 365  */    + (long) (ay - by) * 365l);  return 60l * (60l * (24l * days + (a->tm_hour - b->tm_hour))    + (a->tm_min - b->tm_min)) + (a->tm_sec - b->tm_sec);}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?