conversion to/from DOS date/time (patch 627575)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17709 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-11-04 22:38:15 +00:00
parent 66cf613e7b
commit 9f9cebfb6c
3 changed files with 106 additions and 1 deletions

View File

@@ -235,6 +235,7 @@ values were correct as constructors can not return an error code.
\helpref{Set(double jdn)}{wxdatetimesetjdn}\\ \helpref{Set(double jdn)}{wxdatetimesetjdn}\\
\helpref{Set(h, m, s, ms)}{wxdatetimesettime}\\ \helpref{Set(h, m, s, ms)}{wxdatetimesettime}\\
\helpref{Set(day, mon, year, h, m, s, ms)}{wxdatetimesetdate}\\ \helpref{Set(day, mon, year, h, m, s, ms)}{wxdatetimesetdate}\\
\helpref{SetFromDOS(unsigned long ddt)}{wxdatetimesetfromdos}\\
\helpref{ResetTime}{wxdatetimeresettime}\\ \helpref{ResetTime}{wxdatetimeresettime}\\
\helpref{SetYear}{wxdatetimesetyear}\\ \helpref{SetYear}{wxdatetimesetyear}\\
\helpref{SetMonth}{wxdatetimesetmonth}\\ \helpref{SetMonth}{wxdatetimesetmonth}\\
@@ -268,7 +269,8 @@ some more complicated calculations to find the answer are under the
\helpref{GetWeekOfMonth}{wxdatetimegetweekofmonth}\\ \helpref{GetWeekOfMonth}{wxdatetimegetweekofmonth}\\
\helpref{GetYearDay}{wxdatetimegetyearday}\\ \helpref{GetYearDay}{wxdatetimegetyearday}\\
\helpref{IsWorkDay}{wxdatetimeisworkday}\\ \helpref{IsWorkDay}{wxdatetimeisworkday}\\
\helpref{IsGregorianDate}{wxdatetimeisgregoriandate} \helpref{IsGregorianDate}{wxdatetimeisgregoriandate}\\
\helpref{GetAsDOS}{wxdatetimegetasdos}
\membersection{Date comparison} \membersection{Date comparison}
@@ -882,6 +884,24 @@ Returns {\tt TRUE} if the given date os later than the date of adoption of the
Gregorian calendar in the given country (and hence the Gregorian calendar Gregorian calendar in the given country (and hence the Gregorian calendar
calculations make sense for it). calculations make sense for it).
%%%%%%%%%%%%%%%%%%%%%% dos date and time format %%%%%%%%%%%%%%%%%%%%%%%
\membersection{wxDateTime::SetFromDOS}\label{wxdatetimesetfromdos}
\func{wxDateTime\&}{Set}{\param{unsigned long }{ddt}}
Sets the date from the date and time in
\urlref{DOS}{http://developer.novell.com/ndk/doc/smscomp/index.html?page=/ndk/doc/smscomp/sms\_docs/data/hc2vlu5i.html}
format.
\membersection{wxDateTime::GetAsDOS}\label{wxdatetimegetasdos}
\constfunc{unsigned long}{GetAsDOS}{\void}
Returns the date and time in
\urlref{DOS}{http://developer.novell.com/ndk/doc/smscomp/index.html?page=/ndk/doc/smscomp/sms\_docs/data/hc2vlu5i.html}
format.
%%%%%%%%%%%%%%%%%%%%%%%%%%% comparison %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% comparison %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\membersection{wxDateTime::IsEqualTo}\label{wxdatetimeisequalto} \membersection{wxDateTime::IsEqualTo}\label{wxdatetimeisequalto}

View File

@@ -851,6 +851,15 @@ public:
// adoption of the Gregorian calendar is simply unknown. // adoption of the Gregorian calendar is simply unknown.
bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const; bool IsGregorianDate(GregorianAdoption country = Gr_Standard) const;
// dos date and time format
// ------------------------------------------------------------------------
// set from the DOS packed format
wxDateTime& SetFromDOS(unsigned long ddt);
// pack the date in DOS format
unsigned long GetAsDOS() const;
// comparison (see also functions below for operator versions) // comparison (see also functions below for operator versions)
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------

View File

@@ -1247,6 +1247,82 @@ wxDateTime& wxDateTime::ResetTime()
return *this; return *this;
} }
// ----------------------------------------------------------------------------
// DOS Date and Time Format functions
// ----------------------------------------------------------------------------
// the dos date and time value is an unsigned 32 bit value in the format:
// YYYYYYYMMMMDDDDDhhhhhmmmmmmsssss
//
// Y = year offset from 1980 (0-127)
// M = month (1-12)
// D = day of month (1-31)
// h = hour (0-23)
// m = minute (0-59)
// s = bisecond (0-29) each bisecond indicates two seconds
// ----------------------------------------------------------------------------
wxDateTime& wxDateTime::SetFromDOS(unsigned long ddt)
{
struct tm tm;
long year = ddt & 0xFE000000;
year >>= 25;
year += 80;
tm.tm_year = year;
long month = ddt & 0x1E00000;
month >>= 21;
month -= 1;
tm.tm_mon = month;
long day = ddt & 0x1F0000;
day >>= 16;
tm.tm_mday = day;
long hour = ddt & 0xF800;
hour >>= 11;
tm.tm_hour = hour;
long minute = ddt & 0x7E0;
minute >>= 5;
tm.tm_min = minute;
long second = ddt & 0x1F;
tm.tm_sec = second * 2;
return Set(mktime(&tm));
}
unsigned long wxDateTime::GetAsDOS() const
{
unsigned long ddt;
time_t ticks = GetTicks();
struct tm *tm = localtime(&ticks);
long year = tm->tm_year;
year -= 80;
year <<= 25;
long month = tm->tm_mon;
month += 1;
month <<= 21;
long day = tm->tm_mday;
day <<= 16;
long hour = tm->tm_hour;
hour <<= 11;
long minute = tm->tm_min;
minute <<= 5;
long second = tm->tm_sec;
second /= 2;
ddt = year | month | day | hour | minute | second;
return ddt;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// time_t <-> broken down time conversions // time_t <-> broken down time conversions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------