// =============================================================================
// 文件名稱: TimeUtil.hpp
// 內容說明:
//
// 編寫人: IYFT
// E-Mail: [email protected]
//
// 創建日期:
// 修改日期:
// -----------------------------------------------------------------------------
//
// 修改記錄:
// -
// -
//
// ============================================================================+
// =============================================================================
// 保證源文件只會被編譯一次
// -----------------------------------------------------------------------------
#if _MSC_VER >= 1000
// 使源文件只會被編譯一次
#pragma once
#endif // _MSC_VER >= 1000
#ifndef __HPP_TIMEUTIL_HPP__
#define __HPP_TIMEUTIL_HPP__
// =============================================================================
#define DTM_DATE_LENGTH 10
#define DTM_DATETIME_LENGTH 20
// 返回當前本地時區(單位爲秒,因爲有些時區是小數)
// 北京時區爲 +08:00 = +8*60*60 = +28800
// 德黑蘭時區爲 +03:30 = +3*60*60 + 30*60 = +12600
// 夏威夷時區爲 -10:00 = -10*60*60 = -36000
STATIC LONG DTM_getTimeZone(OUT TIME_ZONE_INFORMATION **ppZT = NULL)
{
STATIC TIME_ZONE_INFORMATION tz;
STATIC DWORD nResult = 0;
STATIC BOOL bInited = FALSE;
if(bInited == FALSE)
{
switch(::GetTimeZoneInformation(&tz))
{
case TIME_ZONE_ID_INVALID:
nResult = 0;
break;
default:
nResult = ((tz.Bias + tz.StandardBias) * -60);
}
bInited = TRUE;
}
if(ppZT != NULL)
{
*ppZT = &tz;
}
return nResult;
}
// 返回當前本地時間
STATIC DWORD DTM_getLocaleCurrentDate()
{
SYSTEMTIME t; ::GetLocalTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
return nDate;
}
// 返回當前本地時間
STATIC DWORD DTM_getLocaleCurrentDate(OUT LPTSTR sDate)
{
SYSTEMTIME t; ::GetLocalTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
LPTSTR sPos = sDate;
INT2T(sPos, 4, t.wYear, 4); sPos+=4;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wMonth, 2); sPos+=2;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wDay, 2); sPos+=2;
*sPos = __T('/0');
return nDate;
}
// 返回當前本地時間
STATIC VOID DTM_getLocaleCurrentString(OUT LPTSTR sDate)
{
SYSTEMTIME t; ::GetLocalTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
LPTSTR sPos = sDate;
INT2T(sPos, 4, t.wYear, 4); sPos+=4;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wMonth, 2); sPos+=2;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wDay, 2); sPos+=2;
*sPos++ = __T(' ');
INT2T(sPos, 2, t.wHour, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wMinute, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wSecond, 2); sPos+=2;
*sPos = __T('/0');
}
// 返回當前標準時間
// 注意:格林威治標準時間和本地時間有時差,北京是8個小時
STATIC DWORD DTM_getCurrentDate()
{
SYSTEMTIME t; ::GetSystemTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
return nDate;
}
// 返回當前標準時間
// 注意:格林威治標準時間和本地時間有時差,北京是8個小時
STATIC DWORD DTM_getCurrentDate(OUT LPTSTR sDate)
{
SYSTEMTIME t; ::GetSystemTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
LPTSTR sPos = sDate;
INT2T(sPos, 4, t.wYear, 4); sPos+=4;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wMonth, 2); sPos+=2;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wDay, 2); sPos+=2;
*sPos = __T('/0');
return nDate;
}
// 返回當前標準時間
// 注意:格林威治標準時間和本地時間有時差,北京是8個小時
STATIC VOID DTM_getCurrentString(OUT LPTSTR sDate)
{
SYSTEMTIME t; ::GetSystemTime(&t);
DWORD nDate = t.wYear * 10000 + t.wMonth * 100 + t.wDay;
LPTSTR sPos = sDate;
INT2T(sPos, 4, t.wYear, 4); sPos+=4;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wMonth, 2); sPos+=2;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wDay, 2); sPos+=2;
*sPos++ = __T(' ');
INT2T(sPos, 2, t.wHour, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wMinute, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wSecond, 2); sPos+=2;
*sPos = __T('/0');
}
// 返回日期時間字符串;格式爲 [YYYY-MM-DD HH:MM:SS]
STATIC VOID DTM_getString(IN SYSTEMTIME t, OUT LPTSTR sTime)
{
LPTSTR sPos = sTime;
INT2T(sPos, 4, t.wYear, 4); sPos+=4;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wMonth, 2); sPos+=2;
*sPos++ = __T('-');
INT2T(sPos, 2, t.wDay, 2); sPos+=2;
*sPos++ = __T(' ');
INT2T(sPos, 2, t.wHour, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wMinute, 2); sPos+=2;
*sPos++ = __T(':');
INT2T(sPos, 2, t.wSecond, 2); sPos+=2;
*sPos = __T('/0');
}
// 返回時間字符串;格式爲 [X 分 X 秒]
STATIC VOID DTM_getTimeText(IN DWORD nTime, OUT LPTSTR sTime)
{
if(nTime < 1000*60)
{
DWORD nIntegral = nTime/1000;
DWORD nDecimal = nTime%1000;
nDecimal = (nDecimal*100)/1000;
INT2T(sTime, 16, nIntegral);
UINT nCount = LPTSTRLen(sTime);
if(nDecimal > 0)
{
sTime[nCount++] = __T('.');
if(nDecimal >= 10)
INT2T(sTime+nCount, 2, (nTime%1000+5)/10, 2);
else
INT2T(sTime+nCount, 2, nDecimal, 2);
nCount += LPTSTRLen(sTime+nCount);
}
sTime[nCount++] = __T(' ');
#ifdef UNICODE
sTime[nCount++] = __W('秒');
#else
sTime[nCount++] = (ACHAR)0xC3; // 秒 = 0xC3EB
sTime[nCount++] = (ACHAR)0xEB; // 秒 = 0xC3EB
#endif
sTime[nCount ] = TCHR_NULL;
}
else
{
INT2T(sTime, 16, nTime/1000/60);
UINT nCount = LPTSTRLen(sTime);
sTime[nCount++] = __T(' ');
#ifdef UNICODE
sTime[nCount++] = __W('分');
#else
sTime[nCount++] = (ACHAR)0xB7; // 分 = 0xB7D6
sTime[nCount++] = (ACHAR)0xD6; // 秒 = 0xB7D6
#endif
nTime = nTime%(1000*60);
DWORD nIntegral = nTime/1000;
DWORD nDecimal = nTime%1000;
if(nIntegral>0 || nDecimal>0)
{
sTime[nCount++] = __T(' ');
nDecimal = (nDecimal*100)/1000;
INT2T(sTime+nCount, 16, nIntegral);
nCount += LPTSTRLen(sTime+nCount);
if(nDecimal > 0)
{
sTime[nCount++] = __T('.');
if(nDecimal >= 10)
INT2T(sTime+nCount, 2, (nTime%1000+5)/10, 2);
else
INT2T(sTime+nCount, 2, nDecimal, 2);
nCount += LPTSTRLen(sTime+nCount);
}
sTime[nCount++] = __T(' ');
#ifdef UNICODE
sTime[nCount++] = __W('秒');
#else
sTime[nCount++] = (ACHAR)0xC3; // 秒 = 0xC3EB
sTime[nCount++] = (ACHAR)0xEB; // 秒 = 0xC3EB
#endif
}
sTime[nCount ] = TCHR_NULL;
}
}
// 將 Unix Time time_t 轉換爲 SYSTEMTIME
STATIC VOID DTM_ConvertTime(IN time_t t,OUT LPSYSTEMTIME pst)
{
FILETIME ft;
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + 116444736000000000;
ft.dwLowDateTime = (DWORD)ll;
ft.dwHighDateTime = (DWORD)(ll >> 32);
::FileTimeToSystemTime(&ft, pst);
}
// 將 Unix Time time_t 轉換爲 FILETIME
STATIC VOID DTM_ConvertTime(IN time_t t,OUT LPFILETIME pft)
{
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + 116444736000000000;
pft->dwLowDateTime = (DWORD)ll;
pft->dwHighDateTime = (DWORD)(ll >> 32);
}
// 將 FILETIME 轉換爲 Unix Time time_t
STATIC time_t DTM_ConvertTime(IN CONST LPSYSTEMTIME pst)
{
FILETIME ft;
::SystemTimeToFileTime(pst, &ft);
LONGLONG ll = ft.dwHighDateTime;
ll <<= 32;
ll |= ft.dwLowDateTime;
ll -= 116444736000000000;
return (time_t)(ll / 10000000);
}
// 將 FILETIME 轉換爲 Unix Time time_t
STATIC time_t DTM_ConvertTime(IN CONST LPFILETIME pft)
{
LONGLONG ll = pft->dwHighDateTime;
ll <<= 32;
ll |= pft->dwLowDateTime;
ll -= 116444736000000000;
return (time_t)(ll / 10000000);
}
#endif // #ifndef __HPP_TIMEUTIL_HPP__