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

📄 date.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
字号:
/* * (C) Copyright 2001 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * 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, * MA 02111-1307 USA *//* * Date & Time support for Philips PCF8563 RTC */#include <common.h>#include <command.h>#include <rtc.h>#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)#define FEBRUARY		2#define	STARTOFTIME		1970#define SECDAY			86400L#define SECYR			(SECDAY * 365)#define	leapyear(year)		((year) % 4 == 0)#define	days_in_year(a) 	(leapyear(a) ? 366 : 365)#define	days_in_month(a) 	(month_days[(a) - 1])static int month_days[12] = {	31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};/* * This only works for the Gregorian calendar - i.e. after 1752 (in the UK) */void GregorianDay(struct rtc_time * tm){	int leapsToDate;	int lastYear;	int day;	int MonthOffset[] = { 0,31,59,90,120,151,181,212,243,273,304,334 };	lastYear=tm->tm_year-1;	/*	 * Number of leap corrections to apply up to end of last year	 */	leapsToDate = lastYear/4 - lastYear/100 + lastYear/400;	/*	 * This year is a leap year if it is divisible by 4 except when it is	 * divisible by 100 unless it is divisible by 400	 *	 * e.g. 1904 was a leap year, 1900 was not, 1996 is, and 2000 will be	 */	if((tm->tm_year%4==0) &&	   ((tm->tm_year%100!=0) || (tm->tm_year%400==0)) &&	   (tm->tm_mon>2)) {		/*		 * We are past Feb. 29 in a leap year		 */		day=1;	} else {		day=0;	}	day += lastYear*365 + leapsToDate + MonthOffset[tm->tm_mon-1] + tm->tm_mday;	tm->tm_wday=day%7;}void to_tm(int tim, struct rtc_time * tm){	register int    i;	register long   hms, day;	day = tim / SECDAY;	hms = tim % SECDAY;	/* Hours, minutes, seconds are easy */	tm->tm_hour = hms / 3600;	tm->tm_min = (hms % 3600) / 60;	tm->tm_sec = (hms % 3600) % 60;	/* Number of years in days */	for (i = STARTOFTIME; day >= days_in_year(i); i++) {		day -= days_in_year(i);	}	tm->tm_year = i;	/* Number of months in days left */	if (leapyear(tm->tm_year)) {		days_in_month(FEBRUARY) = 29;	}	for (i = 1; day >= days_in_month(i); i++) {		day -= days_in_month(i);	}	days_in_month(FEBRUARY) = 28;	tm->tm_mon = i;	/* Days are what is left over (+1) from all that. */	tm->tm_mday = day + 1;	/*	 * Determine the day of week	 */	GregorianDay(tm);}/* Converts Gregorian date to seconds since 1970-01-01 00:00:00. * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. * * [For the Julian calendar (which was used in Russia before 1917, * Britain & colonies before 1752, anywhere else before 1582, * and is still in use by some communities) leave out the * -year/100+year/400 terms, and add 10.] * * This algorithm was first published by Gauss (I think). * * WARNING: this function will overflow on 2106-02-07 06:28:16 on * machines were long is 32-bit! (However, as time_t is signed, we * will already get problems at other places on 2038-01-19 03:14:08) */unsigned longmktime (unsigned int year, unsigned int mon,	unsigned int day, unsigned int hour,	unsigned int min, unsigned int sec){	if (0 >= (int) (mon -= 2)) {	/* 1..12 -> 11,12,1..10 */		mon += 12;		/* Puts Feb last since it has leap day */		year -= 1;	}	return (((		(unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +			year*365 - 719499	    )*24 + hour /* now have hours */	  )*60 + min /* now have minutes */	)*60 + sec; /* finally seconds */}#endif	/* CFG_CMD_DATE */

⌨️ 快捷键说明

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