⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date.c

📁 解压在c盘
💻 C
字号:
/* * Copyright (c) 1998-2001 Caucho Technology -- all rights reserved * * Caucho Technology permits redistribution, modification and use * of this file in source and binary form ("the Software") under the * Caucho Developer Source License ("the License").  The following * conditions must be met: * * 1. Each copy or derived work of the Software must preserve the copyright *    notice and this notice unmodified. * * 2. Redistributions of the Software in source or binary form must include  *    an unmodified copy of the License, normally in a plain ASCII text * * 3. The names "Resin" or "Caucho" are trademarks of Caucho Technology and *    may not be used to endorse products derived from this software. *    "Resin" or "Caucho" may not appear in the names of products derived *    from this software. * * 4. Caucho Technology requests that attribution be given to Resin *    in any manner possible.  We suggest using the "Resin Powered" *    button or creating a "powered by Resin(tm)" link to *    http://www.caucho.com for each page served by Resin. * * This Software is provided "AS IS," without a warranty of any kind.  * ALL EXPRESS OR IMPLIED REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. * * CAUCHO TECHNOLOGY AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE OR ANY THIRD PARTY AS A RESULT OF USING OR * DISTRIBUTING SOFTWARE. IN NO EVENT WILL CAUCHO OR ITS LICENSORS BE LIABLE * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR * INABILITY TO USE SOFTWARE, EVEN IF HE HAS BEEN ADVISED OF THE POSSIBILITY * OF SUCH DAMAGES.       * * @author Scott Ferguson */#include <linux/kernel.h>#include <linux/proc_fs.h>#include <linux/ctype.h>#include <linux/fs.h>#include <linux/smp_lock.h>#include <linux/time.h>#include <asm/uaccess.h>#include <net/ip.h>#include "hardcore.h"#define SEC_PER_DAY (24 * 60 * 60)#define SEC_PER_EON (SEC_PER_DAY * (265 * 400 + 100 - 3))typedef struct date_t {  int time;    int days;    int year;  int is_leap_year;  int day_of_year;    int month;  int day_of_month;  int hour;  int minute;  int second;} date_t;static int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };static char *day_names[] =  {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};static char *month_names[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",                               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};static char g_date_buffer[128];static int g_date_length;static int g_date_time = 0xdeadbeef;static intis_leap_year(int year){  return ! ((year % 4) != 0 || ((year % 100) == 0 && (year % 400) != 0));}static intdiv_floor(int n, int d){  if (n > 0)    return n / d;  else    return (n - d + 1) / d;}static voidcalculate_year(date_t *date){  int days = date->days;  int n400;  int n100;  int n4;  int n1;  // shift to using 1601 as a base  days += (1970 - 1601) * 365 + (1970 - 1601) / 4 - 3;  n400 = div_floor(days, 400 * 365 + 100 - 3);  days -= n400 * (400 * 365 + 100 - 3);  n100 = div_floor(days, 100 * 365 + 25 - 1);  if (n100 == 4)    n100 = 3;  days -= n100 * (100 * 365 + 25 - 1);  n4 = div_floor(days, 4 * 365 + 1);  if (n4 == 25)    n4 = 24;  days -= n4 * (4 * 365 + 1);  n1 = div_floor(days, 365);  if (n1 == 4)    n1 = 3;  date->year = 400 * n400 + 100 * n100 + 4 * n4 + n1 + 1601;  date->is_leap_year = is_leap_year(date->year);    date->day_of_year = days - 365 * n1;}static voidcalculate_month(date_t *date){  int day_of_month = date->day_of_year;  int is_leap_year = date->is_leap_year;  int month;  for (month = 0; month < 12; month++) {    if (month == 1 && is_leap_year) {      if (day_of_month < 29)        break;      else        day_of_month -= 29;    }    else if (day_of_month < days_in_month[month])      break;    else      day_of_month -= days_in_month[month];  }  date->month = month;  date->day_of_month = day_of_month;}static voidcalculate_date(date_t *date, int time){  int time_of_day;    date->time = time;  date->days = div_floor(time, SEC_PER_DAY);  time_of_day = time - SEC_PER_DAY * date->days;  calculate_year(date);  calculate_month(date);  date->hour = time_of_day / 3600;  date->minute = time_of_day / 60 % 60;  date->second = time_of_day % 60;}intformat_date(char *buf, int time){  date_t date;  int len;    calculate_date(&date, time);      len = sprintf(buf, "%s, %.2d %s %d %.2d:%.2d:%.2d GMT",                day_names[(date.days % 7 + 11) % 7],                date.day_of_month + 1,                month_names[date.month],                date.year,                date.hour,                date.minute,                date.second);  return len;}intformat_now(char *buf){  struct timeval time_now;  int now;  get_fast_time(&time_now);  now = time_now.tv_sec;  if (now != g_date_time) {    g_date_length = format_date(g_date_buffer, now);        g_date_time = now;  }  strcpy(buf, g_date_buffer);    return g_date_length;}static intyear_to_day(int year){  if (year > 0) {    year -= 1601;    return (365 * year + year / 4 - year / 100 + year / 400 -            ((1970 - 1601) * 365 + (1970 - 1601) / 4 - 3));  } else {    year = 2000 - year;    return ((2000 - 1970) * 365 + (2000 - 1970) / 4 -             (365 * year + year / 4 - year / 100 + year / 400));  }}static intmonth_to_day(int month, int is_leap_year){  int day = 0;  int i;  for (i = 0; i < month && i < 12; i++) {    day += days_in_month[i];    if (i == 1 && is_leap_year)      day++;  }  return day;}/* * Scan to whitespace or ':' */static char *scan(char **p_string, int dash){  char *string = *p_string;  char ch;  // skip over leading whitespace  for (; (ch = *string); string++) {    if (ch != ' ' && ch != '\t' && ch != ':' && (! dash || ch != '-'))      break;  }  *p_string = string;  for (; (ch = *string); string++) {    if (ch == ' ' || ch == '\t' || ch == ':' || (dash && ch == '-'))      break;  }  return string;}static intparse_int(char *string){  int ch;  int value = 0;  int sign = 1;  if (*string == '-') {    sign = -1;    string++;  }  else if (*string == '+')    string++;    for (; (ch = *string) >= '0' && ch <= '9'; string++)    value = 10 * value + ch - '0';  return sign * value;}  /* * Mon, 17 Jan 1994 11:14:55 -0500 (EST) * * In GMT time */intparse_date(char *string){  int ch;  int day_of_month;  int month;  int time_of_day;  int year;  int time;  char *next;  for (; (ch = *string) == ' ' || ch == '\t'; string++) {  }    next = scan(&string, 1);  if ((ch = *string) && (ch < '0' || ch > '9')) {    string = next;    next = scan(&string, 1);  }  day_of_month = parse_int(string);  string = next;    next = scan(&string, 1);    for (month = 0; month < 12; month++) {    if (! strnicmp(month_names[month], string, 3))      break;  }    if (month == 12)    return 0;  string = next;  next = scan(&string, 1);  year = parse_int(string);  if (year < 50)    year += 2000;  else if (year < 100)    year += 1900;  string = next;  next = scan(&string, 0);  time_of_day = parse_int(string) * 3600;  string = next;  next = scan(&string, 0);  time_of_day += parse_int(string) * 60;  string = next;  next = scan(&string, 0);  time_of_day += parse_int(string);  time = (SEC_PER_DAY * (year_to_day(year) +                          month_to_day(month, is_leap_year(year)) +                          day_of_month - 1) +          time_of_day);  // assume gmt    return time;}

⌨️ 快捷键说明

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