fpc/packages/extra/palmunits/datetime.pp

305 lines
10 KiB
ObjectPascal

(******************************************************************************
*
* Copyright (c) 1995-2000 Palm, Inc. or its subsidiaries.
* All rights reserved.
*
* File: DateTime.h
*
* Release: Palm OS SDK 4.0 (63220)
*
* Description:
* Date and Time calculations
*
* History:
* 1/19/95 rsf - Created by Roger Flores
* 7/15/99 rsf - moved some types in from Preferences.h
* 12/23/99 jmp - eliminated bogus maxTime definition
* 05/16/00 CS Changed DayOfWeekType ot DayOfMonthType.
*
*****************************************************************************)
unit datetime;
interface
uses palmos, coretraps, chars, localemgr;
type
TimeFormatType = Enum;
const
tfColon = 0;
tfColonAMPM = Succ(tfColon); // 1:00 pm
tfColon24h = Succ(tfColonAMPM); // 13:00
tfDot = Succ(tfColon24h);
tfDotAMPM = Succ(tfDot); // 1.00 pm
tfDot24h = Succ(tfDotAMPM); // 13.00
tfHoursAMPM = Succ(tfDot24h); // 1 pm
tfHours24h = Succ(tfHoursAMPM); // 13
tfComma24h = Succ(tfHours24h); // 13,00
type
DaylightSavingsTypes = Enum;
const
dsNone = 0; // Daylight Savings Time not observed
dsUSA = Succ(dsNone); // United States Daylight Savings Time
dsAustralia = Succ(dsUSA); // Australian Daylight Savings Time
dsWesternEuropean = Succ(dsAustralia); // Western European Daylight Savings Time
dsMiddleEuropean = Succ(dsWesternEuropean); // Middle European Daylight Savings Time
dsEasternEuropean = Succ(dsMiddleEuropean); // Eastern European Daylight Savings Time
dsGreatBritain = Succ(dsEasternEuropean); // Great Britain and Eire Daylight Savings Time
dsRumania = Succ(dsGreatBritain); // Rumanian Daylight Savings Time
dsTurkey = Succ(dsRumania); // Turkish Daylight Savings Time
dsAustraliaShifted = Succ(dsTurkey); // Australian Daylight Savings Time with shift in 1986
// pass a TimeFormatType
// Use24HourFormat(t) ((t) == tfColon24h || (t) == tfDot24h || (t) == tfHours24h || (t) == tfComma24h)
// TimeSeparator(t) ((Char) ( t <= tfColon24h ? ':' : (t <= tfDot24h ? '.' : ',')))
type
DateFormatType = Enum;
const
dfMDYWithSlashes = 0; // 12/31/95
dfDMYWithSlashes = Succ(dfMDYWithSlashes); // 31/12/95
dfDMYWithDots = Succ(dfDMYWithSlashes); // 31.12.95
dfDMYWithDashes = Succ(dfDMYWithDots); // 31-12-95
dfYMDWithSlashes = Succ(dfDMYWithDashes); // 95/12/31
dfYMDWithDots = Succ(dfYMDWithSlashes); // 95.12.31
dfYMDWithDashes = Succ(dfYMDWithDots); // 95-12-31
dfMDYLongWithComma = Succ(dfYMDWithDashes); // Dec 31, 1995
dfDMYLong = Succ(dfMDYLongWithComma); // 31 Dec 1995
dfDMYLongWithDot = Succ(dfDMYLong); // 31. Dec 1995
dfDMYLongNoDay = Succ(dfDMYLongWithDot); // Dec 1995
dfDMYLongWithComma = Succ(dfDMYLongNoDay); // 31 Dec, 1995
dfYMDLongWithDot = Succ(dfDMYLongWithComma); // 1995.12.31
dfYMDLongWithSpace = Succ(dfYMDLongWithDot); // 1995 Dec 31
dfMYMed = Succ(dfYMDLongWithSpace); // Dec '95
dfMYMedNoPost = Succ(dfMYMed); // Dec 95 (added for French 2.0 ROM)
dfMDYWithDashes = Succ(dfMYMedNoPost); // 12-31-95 (added for 4.0 ROM)
type
DateTimeType = record
second: Int16;
minute: Int16;
hour: Int16;
day: Int16;
month: Int16;
year: Int16;
weekDay: Int16; // Days since Sunday (0 to 6)
end;
DateTimePtr = ^DateTimeType;
// This is the time format. Times are treated as words so don't
// change the order of the members in this structure.
//
TimeType = record
hours: UInt8;
minutes: UInt8;
end;
TimePtr = ^TimeType;
const
noTime = -1; // The entire TimeType is -1 if there isn't a time.
// This is the date format. Dates are treated as words so don't
// change the order of the members in this structure.
//
type
DateType = record
Bits: UInt16;
{
UInt16 year :7; // years since 1904 (MAC format)
UInt16 month :4;
UInt16 day :5;
}
end;
DatePtr = ^DateType;
(************************************************************
* Date Time Constants
*************************************************************)
// Maximum lengths of strings return by the date and time formating
// routine DateToAscii and TimeToAscii.
const
timeStringLength = 9;
dateStringLength = 9;
longDateStrLength = 15;
dowDateStringLength = 19;
dowLongDateStrLength = 25;
timeZoneStringLength = 50;
firstYear = 1904;
numberOfYears = 128;
lastYear = firstYear + numberOfYears - 1;
// Constants for time calculations
// Could change these from xIny to yPerX
secondsInSeconds = 1;
minutesInSeconds = 60;
hoursInMinutes = 60;
hoursInSeconds = hoursInMinutes * minutesInSeconds;
hoursPerDay = 24;
// daysInSeconds ((Int32)(hoursPerDay) * ((Int32)hoursInSeconds))
daysInSeconds = $15180; // cc bug
daysInWeek = 7;
daysInYear = 365;
daysInLeapYear = 366;
daysInFourYears = daysInLeapYear + 3 * daysInYear;
monthsInYear = 12;
maxDays = UInt32(numberOfYears div 4 * daysInFourYears - 1);
maxSeconds = UInt32((maxDays+1) * daysInSeconds - 1);
// Values returned by DayOfWeek routine.
sunday = 0;
monday = 1;
tuesday = 2;
wednesday = 3;
thursday = 4;
friday = 5;
saturday = 6;
// Months of the year
january = 1;
february = 2;
march = 3;
april = 4;
may = 5;
june = 6;
july = 7;
august = 8;
september = 9;
october = 10;
november = 11;
december = 12;
// Values returned by DayOfMonth routine.
type
DayOfMonthType = Enum;
// It would have been cool to have a real DayOfWeekType, but we #define the
// following for compatibility with existing code. Please use the new name
// (DayOfMonthType).
DayOfWeekType = DayOfMonthType;
const
dom1stSun = 0;
dom1stMon = Succ(dom1stSun);
dom1stTue = Succ(dom1stMon);
dom1stWen = Succ(dom1stTue);
dom1stThu = Succ(dom1stWen);
dom1stFri = Succ(dom1stThu);
dom1stSat = Succ(dom1stFri);
dom2ndSun = Succ(dom1stSat);
dom2ndMon = Succ(dom2ndSun);
dom2ndTue = Succ(dom2ndMon);
dom2ndWen = Succ(dom2ndTue);
dom2ndThu = Succ(dom2ndWen);
dom2ndFri = Succ(dom2ndThu);
dom2ndSat = Succ(dom2ndFri);
dom3rdSun = Succ(dom2ndSat);
dom3rdMon = Succ(dom3rdSun);
dom3rdTue = Succ(dom3rdMon);
dom3rdWen = Succ(dom3rdTue);
dom3rdThu = Succ(dom3rdWen);
dom3rdFri = Succ(dom3rdThu);
dom3rdSat = Succ(dom3rdFri);
dom4thSun = Succ(dom3rdSat);
dom4thMon = Succ(dom4thSun);
dom4thTue = Succ(dom4thMon);
dom4thWen = Succ(dom4thTue);
dom4thThu = Succ(dom4thWen);
dom4thFri = Succ(dom4thThu);
dom4thSat = Succ(dom4thFri);
domLastSun = Succ(dom4thSat);
domLastMon = Succ(domLastSun);
domLastTue = Succ(domLastMon);
domLastWen = Succ(domLastTue);
domLastThu = Succ(domLastWen);
domLastFri = Succ(domLastThu);
domLastSa = Succ(domLastFri);
// Values used by DateTemplateToAscii routine.
dateTemplateChar = chrCircumflexAccent;
dateTemplateDayNum = '0';
dateTemplateDOWName = Succ(dateTemplateDayNum);
dateTemplateMonthName = Succ(dateTemplateDOWName);
dateTemplateMonthNum = Succ(dateTemplateMonthName);
dateTemplateYearNum = Succ(dateTemplateMonthNum);
dateTemplateShortModifier = 's';
dateTemplateRegularModifier = 'r';
dateTemplateLongModifier = 'l';
dateTemplateLeadZeroModifier = 'z';
//************************************************************
//* Date and Time macros
//***********************************************************
{
// Convert a date in a DateType structure to an UInt16.
DateToInt(date) (*(UInt16 *) &date)
// Convert a date in a DateType structure to a signed int.
TimeToInt(time) (*(Int16 *) &time)
}
//************************************************************
//* Date Time procedures
//************************************************************
procedure TimSecondsToDateTime(seconds: UInt32; dateTimeP: DateTimePtr); syscall sysTrapTimSecondsToDateTime;
function TimDateTimeToSeconds(dateTimeP: DateTimePtr): UInt32; syscall sysTrapTimDateTimeToSeconds;
procedure TimAdjust(dateTimeP: DateTimePtr; adjustment: Int32); syscall sysTrapTimAdjust;
procedure TimeToAscii(hours, minutes: UInt8; timeFormat: TimeFormatType; pString: PChar); syscall sysTrapTimeToAscii;
function TimTimeZoneToUTC(seconds: UInt32; timeZone: Int16; daylightSavingAdjustment: Int16): UInt32; syscall sysTrapTimTimeZoneToUTC;
function TimUTCToTimeZone(seconds: UInt32; timeZone: Int16; daylightSavingAdjustment: Int16): UInt32; syscall sysTrapTimUTCToTimeZone;
procedure TimeZoneToAscii(timeZone: Int16; localeP: LmLocalePtr; string_: PChar); syscall sysTrapTimeZoneToAscii;
function DaysInMonth(month, year: Int16): Int16; syscall sysTrapDaysInMonth;
function DayOfWeek(month, day, year: Int16): Int16; syscall sysTrapDayOfWeek;
function DayOfMonth(month, day, year: Int16): Int16; syscall sysTrapDayOfMonth;
// Date routines.
procedure DateSecondsToDate(seconds: UInt32; date: DatePtr); syscall sysTrapDateSecondsToDate;
procedure DateDaysToDate(days: UInt32; date: DatePtr); syscall sysTrapDateDaysToDate;
function DateToDays(date: DateType): UInt32; syscall sysTrapDateToDays;
procedure DateAdjust(dateP: DatePtr; adjustment: Int32); syscall sysTrapDateAdjust;
procedure DateToAscii(months, days: UInt8; years: UInt16;
dateFormat: DateFormatType; pString: PChar); syscall sysTrapDateToAscii;
procedure DateToDOWDMFormat(months, days: UInt8; years: UInt16;
dateFormat: DateFormatType; pString: PChar); syscall sysTrapDateToDOWDMFormat;
function DateTemplateToAscii(const templateP: PChar; months, days: UInt8;
years: UInt16; stringP: PChar; stringLen: Int16): UInt16; syscall sysTrapDateTemplateToAscii;
implementation
end.