Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

289 lines
6.5 KiB

//---------------------------------------------------------------------------
// TimeConv.cpp : Date time conversion routines
//
// Copyright (c) 1996 Microsoft Corporation, All Rights Reserved
// Developed by Sheridan Software Systems, Inc.
//---------------------------------------------------------------------------
#include "stdafx.h"
#include "timeconv.h"
#include <math.h>
#include <limits.h>
// needed for ASSERTs and FAIL
//
SZTHISFILE
//-----------------------------------------------------------------------
// The following routines convert between differnt data/time formats
// they return TRUE if successful otherwise they return FALSE
//-----------------------------------------------------------------------
BOOL VDConvertToFileTime(DBTIMESTAMP * pDBTimeStamp, FILETIME * pFileTime)
{
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBTimeStamp, DBTIMESTAMP);
if (pFileTime &&
pDBTimeStamp)
{
SYSTEMTIME st;
st.wYear = pDBTimeStamp->year;
st.wMonth = pDBTimeStamp->month;
st.wDay = pDBTimeStamp->day;
st.wDayOfWeek = 0; // ?
st.wHour = pDBTimeStamp->hour;
st.wMinute = pDBTimeStamp->minute;
st.wSecond = pDBTimeStamp->second;
st.wMilliseconds = (USHORT)(pDBTimeStamp->fraction / 1000000);
return SystemTimeToFileTime(&st, pFileTime);
}
return FALSE;
}
BOOL VDConvertToFileTime(DBDATE * pDBDate, FILETIME * pFileTime)
{
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBDate, DBDATE);
if (pFileTime &&
pDBDate)
{
SYSTEMTIME st;
st.wYear = pDBDate->year;
st.wMonth = pDBDate->month;
st.wDay = pDBDate->day;
st.wDayOfWeek = 0;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;
st.wMilliseconds = 0;
return SystemTimeToFileTime(&st, pFileTime);
}
return FALSE;
}
BOOL VDConvertToFileTime(DBTIME * pDBTime, FILETIME * pFileTime)
{
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBTime, DBTIME);
if (pFileTime &&
pDBTime)
{
SYSTEMTIME st;
st.wYear = 1996; // any date will do since we
st.wMonth = 07; // are only interested in the time
st.wDay = 30;
st.wDayOfWeek = 2;
st.wHour = pDBTime->hour;
st.wMinute = pDBTime->minute;
st.wSecond = pDBTime->second;
st.wMilliseconds = 0;
return SystemTimeToFileTime(&st, pFileTime);
}
return FALSE;
}
BOOL VDConvertToFileTime(DATE * pDate, FILETIME * pFileTime)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pFileTime, FILETIME);
if (pDate &&
pFileTime)
{
WORD wFatDate;
WORD wFatTime;
if (VariantTimeToDosDateTime(*pDate, &wFatDate, &wFatTime))
return DosDateTimeToFileTime(wFatDate, wFatTime, pFileTime);
}
return FALSE;
}
BOOL VDConvertToDBTimeStamp(FILETIME * pFileTime, DBTIMESTAMP * pDBTimeStamp)
{
SYSTEMTIME st;
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBTimeStamp, DBTIMESTAMP);
if (pFileTime &&
pDBTimeStamp &&
FileTimeToSystemTime(pFileTime, &st))
{
pDBTimeStamp->year = st.wYear;
pDBTimeStamp->month = st.wMonth;
pDBTimeStamp->day = st.wDay;
pDBTimeStamp->hour = st.wHour;
pDBTimeStamp->minute = st.wMinute;
pDBTimeStamp->second = st.wSecond;
pDBTimeStamp->fraction = (ULONG)st.wMilliseconds * 1000000;
return TRUE;
}
return FALSE;
}
BOOL VDConvertToDBTimeStamp(DATE * pDate, DBTIMESTAMP * pDBTimeStamp)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBTimeStamp, DBTIMESTAMP);
if (pDate &&
pDBTimeStamp)
{
FILETIME filetime;
if (VDConvertToFileTime(pDate, &filetime))
return VDConvertToDBTimeStamp(&filetime, pDBTimeStamp);
}
return FALSE;
}
BOOL VDConvertToDBDate(FILETIME * pFileTime, DBDATE * pDBDate)
{
SYSTEMTIME st;
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBDate, DBDATE);
if (pFileTime &&
pDBDate &&
FileTimeToSystemTime(pFileTime, &st))
{
pDBDate->year = st.wYear;
pDBDate->month = st.wMonth;
pDBDate->day = st.wDay;
return TRUE;
}
return FALSE;
}
BOOL VDConvertToDBDate(DATE * pDate, DBDATE * pDBDate)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBDate, DBDATE);
if (pDate &&
pDBDate)
{
FILETIME filetime;
if (VDConvertToFileTime(pDate, &filetime))
return VDConvertToDBDate(&filetime, pDBDate);
}
return FALSE;
}
BOOL VDConvertToDBTime(FILETIME * pFileTime, DBTIME * pDBTime)
{
SYSTEMTIME st;
ASSERT_POINTER(pFileTime, FILETIME);
ASSERT_POINTER(pDBTime, DBTIME);
if (pFileTime &&
pDBTime &&
FileTimeToSystemTime(pFileTime, &st))
{
pDBTime->hour = st.wHour;
pDBTime->minute = st.wMinute;
pDBTime->second = st.wSecond;
return TRUE;
}
return FALSE;
}
BOOL VDConvertToDBTime(DATE * pDate, DBTIME * pDBTime)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBTime, DBTIME);
if (pDate &&
pDBTime)
{
FILETIME filetime;
if (VDConvertToFileTime(pDate, &filetime))
return VDConvertToDBTime(&filetime, pDBTime);
}
return FALSE;
}
BOOL VDConvertToDate(FILETIME * pFileTime, DATE * pDate)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pFileTime, FILETIME);
if (pDate &&
pFileTime)
{
WORD wFatDate;
WORD wFatTime;
if (FileTimeToDosDateTime(pFileTime, &wFatDate, &wFatTime))
return DosDateTimeToVariantTime(wFatDate, wFatTime, pDate);
}
return FALSE;
}
BOOL VDConvertToDate(DBTIMESTAMP * pDBTimeStamp, DATE * pDate)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBTimeStamp, DBTIMESTAMP);
if (pDate &&
pDBTimeStamp)
{
FILETIME fileTime;
if (VDConvertToFileTime(pDBTimeStamp, &fileTime))
return VDConvertToDate(&fileTime, pDate);
}
return FALSE;
}
BOOL VDConvertToDate(DBTIME * pDBTime, DATE * pDate)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBTime, DBTIME);
if (pDate &&
pDBTime)
{
FILETIME fileTime;
if (VDConvertToFileTime(pDBTime, &fileTime))
{
DATE date;
if (VDConvertToDate(&fileTime, &date))
{
DATE dateIntegerPart;
// return only the time (fractional part of double)
*pDate = modf(date, &dateIntegerPart);
}
}
}
return FALSE;
}
BOOL VDConvertToDate(DBDATE * pDBDate, DATE * pDate)
{
ASSERT_POINTER(pDate, DATE);
ASSERT_POINTER(pDBDate, DBDATE);
if (pDate &&
pDBDate)
{
FILETIME fileTime;
if (VDConvertToFileTime(pDBDate, &fileTime))
return VDConvertToDate(&fileTime, pDate);
}
return FALSE;
}