mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			301 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/***************************************************************
 | 
						|
  time.c
 | 
						|
 | 
						|
  author : uema2
 | 
						|
  date   : Nov 30, 2002
 | 
						|
 | 
						|
  You can freely use, copy, modify, and redistribute
 | 
						|
  the whole contents.
 | 
						|
***************************************************************/
 | 
						|
 | 
						|
/*#define __SCRATCH_TIMEC_DEBUG__ */
 | 
						|
 | 
						|
#include <windows.h>
 | 
						|
#include <tchar.h>
 | 
						|
#include <time.h>
 | 
						|
 | 
						|
/* globals */
 | 
						|
const __int64 _onesec_in100ns = (__int64)10000000;
 | 
						|
int   timezone, _timezone, altzone;
 | 
						|
int   daylight;
 | 
						|
char *tzname[2];
 | 
						|
 | 
						|
 | 
						|
/* __int64 <--> FILETIME */
 | 
						|
static __int64 wce_FILETIME2int64(FILETIME f)
 | 
						|
{
 | 
						|
	__int64 t;
 | 
						|
 | 
						|
	t = f.dwHighDateTime;
 | 
						|
	t <<= 32;
 | 
						|
	t |= f.dwLowDateTime;
 | 
						|
	return t;
 | 
						|
}
 | 
						|
 | 
						|
static FILETIME wce_int642FILETIME(__int64 t)
 | 
						|
{
 | 
						|
	FILETIME f;
 | 
						|
 | 
						|
	f.dwHighDateTime = (DWORD)((t >> 32) & 0x00000000FFFFFFFF);
 | 
						|
	f.dwLowDateTime  = (DWORD)( t        & 0x00000000FFFFFFFF);
 | 
						|
	return f;
 | 
						|
}
 | 
						|
 | 
						|
/* FILETIME utility */
 | 
						|
static FILETIME wce_getFILETIMEFromYear(WORD year)
 | 
						|
{
 | 
						|
	SYSTEMTIME s={0};
 | 
						|
	FILETIME f;
 | 
						|
 | 
						|
	s.wYear      = year;
 | 
						|
	s.wMonth     = 1;
 | 
						|
	s.wDayOfWeek = 1;
 | 
						|
	s.wDay       = 1;
 | 
						|
 | 
						|
	SystemTimeToFileTime( &s, &f );
 | 
						|
	return f;
 | 
						|
}
 | 
						|
 | 
						|
static time_t wce_getYdayFromSYSTEMTIME(const SYSTEMTIME* s)
 | 
						|
{
 | 
						|
	__int64 t;
 | 
						|
	FILETIME f1, f2;
 | 
						|
 | 
						|
	f1 = wce_getFILETIMEFromYear( s->wYear );
 | 
						|
	SystemTimeToFileTime( s, &f2 );
 | 
						|
 | 
						|
	t = wce_FILETIME2int64(f2)-wce_FILETIME2int64(f1);
 | 
						|
 | 
						|
	return (time_t)((t/_onesec_in100ns)/(60*60*24));
 | 
						|
}
 | 
						|
 | 
						|
/* tm <--> SYSTEMTIME */
 | 
						|
static SYSTEMTIME wce_tm2SYSTEMTIME(struct tm *t)
 | 
						|
{
 | 
						|
	SYSTEMTIME s;
 | 
						|
 | 
						|
	s.wYear      = t->tm_year + 1900;
 | 
						|
	s.wMonth     = t->tm_mon  + 1;
 | 
						|
	s.wDayOfWeek = t->tm_wday;
 | 
						|
	s.wDay       = t->tm_mday;
 | 
						|
	s.wHour      = t->tm_hour;
 | 
						|
	s.wMinute    = t->tm_min;
 | 
						|
	s.wSecond    = t->tm_sec;
 | 
						|
	s.wMilliseconds = 0;
 | 
						|
 | 
						|
	return s;
 | 
						|
}
 | 
						|
 | 
						|
static struct tm wce_SYSTEMTIME2tm(SYSTEMTIME *s)
 | 
						|
{
 | 
						|
	struct tm t;
 | 
						|
 | 
						|
	t.tm_year  = s->wYear - 1900;
 | 
						|
	t.tm_mon   = s->wMonth- 1;
 | 
						|
	t.tm_wday  = s->wDayOfWeek;
 | 
						|
	t.tm_mday  = s->wDay;
 | 
						|
	t.tm_yday  = wce_getYdayFromSYSTEMTIME(s);
 | 
						|
	t.tm_hour  = s->wHour;
 | 
						|
	t.tm_min   = s->wMinute;
 | 
						|
	t.tm_sec   = s->wSecond;
 | 
						|
	t.tm_isdst = 0;
 | 
						|
 | 
						|
	return t;
 | 
						|
}
 | 
						|
 | 
						|
/* FILETIME <--> time_t */
 | 
						|
time_t wce_FILETIME2time_t(const FILETIME* f)
 | 
						|
{
 | 
						|
	FILETIME f1601, f1970;
 | 
						|
	__int64 t, offset;
 | 
						|
 | 
						|
	f1601 = wce_getFILETIMEFromYear(1601);
 | 
						|
	f1970 = wce_getFILETIMEFromYear(1970);
 | 
						|
 | 
						|
	offset = wce_FILETIME2int64(f1970) - wce_FILETIME2int64(f1601);
 | 
						|
 | 
						|
	t = wce_FILETIME2int64(*f);
 | 
						|
 | 
						|
	t -= offset;
 | 
						|
	return (time_t)(t / _onesec_in100ns);
 | 
						|
}
 | 
						|
 | 
						|
FILETIME wce_time_t2FILETIME(const time_t t)
 | 
						|
{
 | 
						|
	FILETIME f, f1970;
 | 
						|
	__int64 time;
 | 
						|
 | 
						|
	f1970 = wce_getFILETIMEFromYear(1970);
 | 
						|
 | 
						|
	time = t;
 | 
						|
	time *= _onesec_in100ns;
 | 
						|
	time += wce_FILETIME2int64(f1970);
 | 
						|
 | 
						|
	f = wce_int642FILETIME(time);
 | 
						|
 | 
						|
	return f;
 | 
						|
}
 | 
						|
 | 
						|
/* time.h difinition */
 | 
						|
time_t time( time_t *timer )
 | 
						|
{
 | 
						|
	SYSTEMTIME s;
 | 
						|
	FILETIME   f;
 | 
						|
 | 
						|
	if( timer==NULL ) return 0;
 | 
						|
 | 
						|
	GetSystemTime( &s );
 | 
						|
 | 
						|
	SystemTimeToFileTime( &s, &f );
 | 
						|
 | 
						|
	*timer = wce_FILETIME2time_t(&f);
 | 
						|
	return *timer;
 | 
						|
}
 | 
						|
 | 
						|
struct tm *localtime( const time_t *timer )
 | 
						|
{
 | 
						|
	SYSTEMTIME ss, ls, s;
 | 
						|
	FILETIME   sf, lf, f;
 | 
						|
	__int64 t, diff;
 | 
						|
	static struct tm tms;
 | 
						|
 | 
						|
	GetSystemTime(&ss);
 | 
						|
	GetLocalTime(&ls);
 | 
						|
 | 
						|
	SystemTimeToFileTime( &ss, &sf );
 | 
						|
	SystemTimeToFileTime( &ls, &lf );
 | 
						|
 | 
						|
	diff = wce_FILETIME2int64(sf) - wce_FILETIME2int64(lf);
 | 
						|
 | 
						|
	f = wce_time_t2FILETIME(*timer);
 | 
						|
	t = wce_FILETIME2int64(f) - diff;
 | 
						|
	f = wce_int642FILETIME(t);
 | 
						|
 | 
						|
	FileTimeToSystemTime( &f, &s );
 | 
						|
 | 
						|
	tms = wce_SYSTEMTIME2tm(&s);
 | 
						|
 | 
						|
	return &tms;
 | 
						|
}
 | 
						|
 | 
						|
time_t mktime(struct tm* pt)
 | 
						|
{
 | 
						|
	SYSTEMTIME ss, ls, s;
 | 
						|
	FILETIME   sf, lf, f;
 | 
						|
	__int64 diff;
 | 
						|
 | 
						|
	GetSystemTime(&ss);
 | 
						|
	GetLocalTime(&ls);
 | 
						|
	SystemTimeToFileTime( &ss, &sf );
 | 
						|
	SystemTimeToFileTime( &ls, &lf );
 | 
						|
 | 
						|
	diff = (wce_FILETIME2int64(lf)-wce_FILETIME2int64(sf))/_onesec_in100ns;
 | 
						|
 | 
						|
	s = wce_tm2SYSTEMTIME(pt);
 | 
						|
	SystemTimeToFileTime( &s, &f );
 | 
						|
	return wce_FILETIME2time_t(&f) - (time_t)diff;
 | 
						|
}
 | 
						|
 | 
						|
struct tm *gmtime(const time_t *t)
 | 
						|
{
 | 
						|
	FILETIME f;
 | 
						|
	SYSTEMTIME s;
 | 
						|
	static struct tm tms;
 | 
						|
	
 | 
						|
	f = wce_time_t2FILETIME(*t);
 | 
						|
	FileTimeToSystemTime(&f, &s);
 | 
						|
	tms = wce_SYSTEMTIME2tm(&s);
 | 
						|
	return &tms;
 | 
						|
}
 | 
						|
 | 
						|
char* ctime( const time_t *t )
 | 
						|
{
 | 
						|
	// Wed Jan 02 02:03:55 1980\n\0
 | 
						|
	static char buf[30]={0};
 | 
						|
	char week[] = "Sun Mon Tue Wed Thr Fri Sat ";
 | 
						|
	char month[]= "Jan Feb Mar Apl May Jun Jul Aug Sep Oct Nov Dec ";
 | 
						|
	struct tm tms;
 | 
						|
 | 
						|
	tms = *localtime(t);
 | 
						|
 | 
						|
	strncpy( buf,    week+tms.tm_wday*4, 4 );
 | 
						|
	strncpy( buf+4,  month+tms.tm_mon*4, 4 );
 | 
						|
	sprintf( buf+8,  "%02d ", tms.tm_mday );
 | 
						|
	sprintf( buf+11, "%02d:%02d:%02d %d\n", 
 | 
						|
		tms.tm_hour, tms.tm_min, tms.tm_sec, tms.tm_year+1900 );
 | 
						|
	return buf;
 | 
						|
}
 | 
						|
 | 
						|
char *asctime(const struct tm *pt)
 | 
						|
{
 | 
						|
	static char buf[30]={0};
 | 
						|
	char week[] = "Sun Mon Tue Wed Thr Fri Sat ";
 | 
						|
	char month[]= "Jan Feb Mar Apl May Jun Jul Aug Sep Oct Nov Dec ";
 | 
						|
 | 
						|
	strncpy( buf,    week+pt->tm_wday*4, 4 );
 | 
						|
	strncpy( buf+4,  month+pt->tm_mon*4, 4 );
 | 
						|
	sprintf( buf+8,  "%02d ", pt->tm_mday );
 | 
						|
	sprintf( buf+11, "%02d:%02d:%02d %d\n", 
 | 
						|
		pt->tm_hour, pt->tm_min, pt->tm_sec, pt->tm_year+1900 );
 | 
						|
	return buf;
 | 
						|
}
 | 
						|
 | 
						|
void tzset()
 | 
						|
{
 | 
						|
	daylight = 1;
 | 
						|
	_timezone = 28800;
 | 
						|
	timezone = 28800;
 | 
						|
}
 | 
						|
 | 
						|
int clock(void)
 | 
						|
{
 | 
						|
	return 1;
 | 
						|
}
 | 
						|
 | 
						|
//---------------------------------------------------------------
 | 
						|
#ifdef __SCRATCH_TIMEC_DEBUG__
 | 
						|
 | 
						|
int main()
 | 
						|
{
 | 
						|
	time_t t1, t2;
 | 
						|
	struct tm tm1, tm2;
 | 
						|
 | 
						|
	time( &t1 );
 | 
						|
	tm1 = *localtime(&t1);
 | 
						|
	t1 = mktime(&tm1);
 | 
						|
	tm1 = *gmtime(&t1);
 | 
						|
 | 
						|
	_time( &t2 );
 | 
						|
	tm2 = *_localtime(&t2);
 | 
						|
	t2 = _mktime(&tm2);
 | 
						|
	tm2 = *_gmtime(&t2);
 | 
						|
 | 
						|
	// time, mktime
 | 
						|
	if( t1==t2 )
 | 
						|
		OutputDebugString( "ok\n" );
 | 
						|
	else
 | 
						|
	{
 | 
						|
		static char buf[128];
 | 
						|
		wsprintf( buf, "ng : %d, %d\n", t1, t2 );
 | 
						|
		OutputDebugString( buf );
 | 
						|
	}
 | 
						|
 | 
						|
	// localtime, gmtime
 | 
						|
	if( 0==memcmp( &tm1, &tm2, sizeof(struct tm) ) )
 | 
						|
		OutputDebugString( "ok\n" );
 | 
						|
	else
 | 
						|
		OutputDebugString( "ng\n" );
 | 
						|
 | 
						|
	// ctime
 | 
						|
	OutputDebugString( ctime(&t1) );
 | 
						|
	OutputDebugString( _ctime(&t2) );
 | 
						|
 | 
						|
	// asctime
 | 
						|
	OutputDebugString( asctime(&tm1) );
 | 
						|
	OutputDebugString( _asctime(&tm2) );
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 |