mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-19 18:11:42 +02:00
305 lines
10 KiB
ObjectPascal
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. |