📄 datetime.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel / Standard Extension * * Copyright (C) 2006 by Ken Sakamura. All rights reserved. * T-Kernel / Standard Extension is distributed * under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * * Version: 1.00.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* * datetime.c (libg) * * System time STIME * Unit sec * Reference time/date 1/1/1985 00:00:00 * No. of valid years To 2053 or so * No. of valid seconds 0x00000000 - 0x7fffffff * To allow for time correction based on TIMEZONE, the range of STIME shown below * includes the previous and following days: * 0x00000000-24*60*60 - 0x7fffffff+24*60*60 * * Within the valid range of system time, a leap year simply comes once every four years. * (Year 2000 is a leap year.) * * January 1985 * S M Tu W Th F S * 1 2 3 4 5 * 6 7 8 9 10 11 12 * 13 14 15 16 17 18 19 * 20 21 22 23 24 25 26 * 27 28 29 30 31 */#include <basic.h>#include <extension/datetime.h>#include <libstr.h>#include <stdlib.h>#include <sys/util.h>/* Number of days in four years */#define FourYear ( 365 + 365 + 365 + 366 )/* Number of days in each month (except for leap year) */LOCAL const H Days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };/* Day of week (Count days starting on 1/1/1985) */#define weekday(day) ( ((day) + 2) % 7 )/* * Conversion from calendar date to total number of seconds * Convertible from 12/31/1984 00:00:00 onward * The result is undefined outside the convertible range or in case of parameter error. */EXPORT void DATEtoTIME( STIME *time, DATE_TIM *date ){ div_t d; STIME t; W day, i; if (( date->d_year == 84 ) && ( ((date->d_month == 0 )&&( date->d_days == 366)) || ((date->d_month == 12 )&&( date->d_day == 31)) ) ) { /* December 31, 1984 */ t = date->d_hour; t = (t * 60) + date->d_min; t = (t * 60) + date->d_sec; *time = t - (24*60*60); return; } d = div(date->d_year - 85, 4); day = d.quot * FourYear + d.rem * 365; /* year -> day */ if ( date->d_month == 0 ) { day += date->d_days - 1; } else { for ( i = date->d_month - 2; i >= 0; i-- ) { if (( i == 1 )&&( d.rem == 3 )) { /* February in a leap year */ day += 29; } else { day += Days[i]; } } day += date->d_day - 1; } t = (day * 24) + date->d_hour; /* day -> hour */ t = (t * 60) + date->d_min; /* hour -> minute */ t = (W)(((UW)t * 60U) + (UW)date->d_sec); /* minute -> second */ *time = t;}/* * Conversion from total number of seconds to calendar date * Valid range of time: 0x00000000-24*60*60 - 0x7fffffff+24*60*60 * The result is undefined outside the valid range. */EXPORT void TIMEtoDATE( DATE_TIM *date, STIME time ){ div_t d; W day, i; if (( time < 0 )&&( time >= -24*60*60 )) { /* December 31, 1984 */ d = div(time + (24*60*60), 60); date->d_sec = d.rem; d = div(d.quot, 60); date->d_min = d.rem; date->d_hour = d.quot; date->d_year = 84; date->d_month = 12; date->d_day = 31; date->d_week = 53; date->d_wday = 1; date->d_days = 366; return; } date->d_sec = (W)((UW)time % 60U); /* Second */ d = div((W)((UW)time / 60U), 60); date->d_min = d.rem; /* Minute */ d = div(d.quot, 24); date->d_hour = d.rem; /* Hour */ day = d.quot; /* Total number of days */ date->d_wday = weekday(day); /* Day of week */ d = div(day, FourYear); date->d_year = 85 + (d.quot * 4); d = div(d.rem, 365); if ( d.quot > 3 ) { d.quot--; d.rem += 365; } date->d_year += d.quot; /* Year */ date->d_days = d.rem + 1; /* Number of days */ i = weekday(day - d.rem); /* Day of week on Jan. 1 of that year */ date->d_week = ((d.rem + i) / 7) + 1; /* Week */ day = d.rem; for ( i = 0; i < 12; i++ ) { if (( i == 1 )&&( d.quot == 3 )) { /* February in a leap year */ if ( day < 29 ) { break; } day -= 29; } else { if ( day < Days[i] ) { break; } day -= Days[i]; } } date->d_month = i + 1; /* Month */ date->d_day = day + 1; /* Day */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -