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

📄 datetime.c

📁 这是一个完全开放的
💻 C
字号:
/* * jabberd - Jabber Open Source Server * Copyright (c) 2002-2003 Jeremie Miller, Thomas Muldowney, *                         Ryan Eatmon, Robert Norris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA */#include "util/util.h"/* ISO 8601 / JEP-0082 date/time manipulation *//* formats */#define DT_DATETIME_P       "%04d-%02d-%02dT%02d:%02d:%lf+%02d:%02d"#define DT_DATETIME_M       "%04d-%02d-%02dT%02d:%02d:%lf-%02d:%02d"#define DT_DATETIME_Z       "%04d-%02d-%02dT%02d:%02d:%lfZ"#define DT_TIME_P           "%02d:%02d:%lf+%02d:%02d"#define DT_TIME_M           "%02d:%02d:%lf-%02d:%02d"#define DT_TIME_Z           "%02d:%02d:%lfZ"#define DT_LEGACY           "%04d%02d%02dT%02d:%02d:%lf"time_t datetime_in(char *date) {    struct tm gmt, off;    double sec;    off_t fix;    struct timeval tv;    struct timezone tz;    assert((int) date);    /* !!! sucks having to call this each time */    tzset();    memset(&gmt, 0, sizeof(struct tm));    memset(&off, 0, sizeof(struct tm));    if(sscanf(date, DT_DATETIME_P,                   &gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,                   &gmt.tm_hour, &gmt.tm_min, &sec,                   &off.tm_hour, &off.tm_min) == 8) {        gmt.tm_sec = (int) sec;        gmt.tm_year -= 1900;        gmt.tm_mon--;        fix = off.tm_hour * 3600 + off.tm_min * 60;    }    else if(sscanf(date, DT_DATETIME_M,                   &gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,                   &gmt.tm_hour, &gmt.tm_min, &sec,                   &off.tm_hour, &off.tm_min) == 8) {        gmt.tm_sec = (int) sec;        gmt.tm_year -= 1900;        gmt.tm_mon--;        fix = - off.tm_hour * 3600 - off.tm_min * 60;    }    else if(sscanf(date, DT_DATETIME_Z,                   &gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,                   &gmt.tm_hour, &gmt.tm_min, &sec) == 6) {        gmt.tm_sec = (int) sec;        gmt.tm_year -= 1900;        gmt.tm_mon--;        fix = 0;    }    else if(sscanf(date, DT_TIME_P,                   &gmt.tm_hour, &gmt.tm_min, &sec,                   &off.tm_hour, &off.tm_min) == 5) {        gmt.tm_sec = (int) sec;        fix = off.tm_hour * 3600 + off.tm_min * 60;    }    else if(sscanf(date, DT_TIME_M,                   &gmt.tm_hour, &gmt.tm_min, &sec,                   &off.tm_hour, &off.tm_min) == 5) {        gmt.tm_sec = (int) sec;        fix = - off.tm_hour * 3600 - off.tm_min * 60;    }    else if(sscanf(date, DT_TIME_Z,                   &gmt.tm_hour, &gmt.tm_min, &sec) == 3) {        gmt.tm_sec = (int) sec;        fix = - off.tm_hour * 3600 - off.tm_min * 60;    }    else if(sscanf(date, DT_LEGACY,                   &gmt.tm_year, &gmt.tm_mon, &gmt.tm_mday,                   &gmt.tm_hour, &gmt.tm_min, &sec) == 6) {        gmt.tm_sec = (int) sec;        gmt.tm_year -= 1900;        gmt.tm_mon--;        fix = 0;    }    gmt.tm_isdst = -1;    gettimeofday(&tv, &tz);    return mktime(&gmt) + fix - (tz.tz_minuteswest * 60);}void datetime_out(time_t t, datetime_t type, char *date, int datelen) {    struct tm *gmt;    assert((int) type);    assert((int) date);    assert((int) datelen);    gmt = gmtime(&t);    switch(type) {        case dt_DATE:            snprintf(date, datelen, "%04d-%02d-%02d", gmt->tm_year + 1900, gmt->tm_mon + 1, gmt->tm_mday);            break;        case dt_TIME:            snprintf(date, datelen, "%02d:%02d:%02dZ", gmt->tm_hour, gmt->tm_min, gmt->tm_sec);            break;        case dt_DATETIME:            snprintf(date, datelen, "%04d-%02d-%02dT%02d:%02d:%02dZ", gmt->tm_year + 1900, gmt->tm_mon + 1, gmt->tm_mday, gmt->tm_hour, gmt->tm_min, gmt->tm_sec);            break;        case dt_LEGACY:            snprintf(date, datelen, "%04d%02d%02dT%02d:%02d:%02d", gmt->tm_year + 1900, gmt->tm_mon + 1, gmt->tm_mday, gmt->tm_hour, gmt->tm_min, gmt->tm_sec);            break;    }}

⌨️ 快捷键说明

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