Go to the source code of this file.
Defines | |
#define | EGG_TIMEZONE_LOOKUP -100000 |
Functions | |
int | date_timezone () |
int | date_scan (char *timestr, time_t *now, int zone, time_t *timeptr) |
#define EGG_TIMEZONE_LOOKUP -100000 |
int date_scan | ( | char * | timestr, | |
time_t * | now, | |||
int | zone, | |||
time_t * | timeptr | |||
) |
Definition at line 840 of file date.c.
References Convert(), date_DateDay, date_DateDayNumber, date_DateDayOrdinal, date_DateDSTmode, date_DateHaveDate, date_DateHaveDay, date_DateHaveOrdinalMonth, date_DateHaveRel, date_DateHaveTime, date_DateHaveZone, date_DateHour, date_DateInput, date_DateMeridian, date_DateMinutes, date_DateMonth, date_DateMonthOrdinal, date_Dateparse(), date_DateRelDay, date_DateRelMonth, date_DateRelPointer, date_DateRelSeconds, date_DateSeconds, date_DateTimezone, date_DateYear, date_timezone(), DSTmaybe, DSToff, EGG_TIMEZONE_LOOKUP, MER24, NamedDay(), NamedMonth(), NULL, RelativeDay(), RelativeMonth(), and TM_YEAR_BASE.
00841 { 00842 struct tm *tm; 00843 time_t Start; 00844 time_t Time; 00845 time_t tod; 00846 int thisyear; 00847 00848 /* Look up timezone if required. */ 00849 if (zone == EGG_TIMEZONE_LOOKUP) zone = date_timezone(); 00850 00851 date_DateInput = timestr; 00852 /* now has to be cast to a time_t for 64bit compliance */ 00853 Start = *now; 00854 tm = localtime(&Start); 00855 thisyear = tm->tm_year + TM_YEAR_BASE; 00856 date_DateYear = thisyear; 00857 date_DateMonth = tm->tm_mon + 1; 00858 date_DateDay = tm->tm_mday; 00859 date_DateTimezone = zone; 00860 if (zone == -50000) { 00861 date_DateDSTmode = DSToff; /* assume GMT */ 00862 date_DateTimezone = 0; 00863 } else { 00864 date_DateDSTmode = DSTmaybe; 00865 } 00866 date_DateHour = 0; 00867 date_DateMinutes = 0; 00868 date_DateSeconds = 0; 00869 date_DateMeridian = MER24; 00870 date_DateRelSeconds = 0; 00871 date_DateRelMonth = 0; 00872 date_DateRelDay = 0; 00873 date_DateRelPointer = NULL; 00874 00875 date_DateHaveDate = 0; 00876 date_DateHaveDay = 0; 00877 date_DateHaveOrdinalMonth = 0; 00878 date_DateHaveRel = 0; 00879 date_DateHaveTime = 0; 00880 date_DateHaveZone = 0; 00881 00882 if (date_Dateparse() || date_DateHaveTime > 1 || date_DateHaveZone > 1 || date_DateHaveDate > 1 || 00883 date_DateHaveDay > 1 || date_DateHaveOrdinalMonth > 1) { 00884 return -1; 00885 } 00886 00887 if (date_DateHaveDate || date_DateHaveTime || date_DateHaveDay) { 00888 if (date_DateYear < 0) { 00889 date_DateYear = -date_DateYear; 00890 } 00891 /* 00892 * The following line handles years that are specified using 00893 * only two digits. The line of code below implements a policy 00894 * defined by the X/Open workgroup on the millinium rollover. 00895 * Note: some of those dates may not actually be valid on some 00896 * platforms. The POSIX standard startes that the dates 70-99 00897 * shall refer to 1970-1999 and 00-38 shall refer to 2000-2038. 00898 * This later definition should work on all platforms. 00899 */ 00900 00901 if (date_DateYear < 100) { 00902 if (date_DateYear >= 69) { 00903 date_DateYear += 1900; 00904 } else { 00905 date_DateYear += 2000; 00906 } 00907 } 00908 if (Convert(date_DateMonth, date_DateDay, date_DateYear, date_DateHour, date_DateMinutes, date_DateSeconds, 00909 date_DateMeridian, date_DateDSTmode, &Start) < 0) { 00910 return -1; 00911 } 00912 } else { 00913 Start = *now; 00914 if (!date_DateHaveRel) { 00915 Start -= ((tm->tm_hour * 60L * 60L) + 00916 tm->tm_min * 60L) + tm->tm_sec; 00917 } 00918 } 00919 00920 Start += date_DateRelSeconds; 00921 if (RelativeMonth(Start, date_DateRelMonth, &Time) < 0) { 00922 return -1; 00923 } 00924 Start += Time; 00925 00926 if (RelativeDay(Start, date_DateRelDay, &Time) < 0) { 00927 return -1; 00928 } 00929 Start += Time; 00930 00931 if (date_DateHaveDay && !date_DateHaveDate) { 00932 tod = NamedDay(Start, date_DateDayOrdinal, date_DateDayNumber); 00933 Start += tod; 00934 } 00935 00936 if (date_DateHaveOrdinalMonth) { 00937 tod = NamedMonth(Start, date_DateMonthOrdinal, date_DateMonth); 00938 Start += tod; 00939 } 00940 00941 *timeptr = Start; 00942 return 0; 00943 }
int date_timezone | ( | ) |
Definition at line 389 of file date.c.
References now.
Referenced by date_scan(), and RelativeMonth().
00390 { 00391 struct tm gmt, local; 00392 time_t now; 00393 int zone; 00394 00395 time(&now); 00396 gmt = *(gmtime(&now)); 00397 local = *(localtime(&now)); 00398 local.tm_isdst = gmt.tm_isdst = 0; 00399 zone = (int)(mktime(&local) - mktime(&gmt)); 00400 return(zone/60); 00401 }