From: <ai...@us...> - 2009-02-02 21:18:04
|
Revision: 9437 http://plplot.svn.sourceforge.net/plplot/?rev=9437&view=rev Author: airwin Date: 2009-02-02 21:18:00 +0000 (Mon, 02 Feb 2009) Log Message: ----------- Initial commit of plain text and docbook form of the documentation. These were converted by openoffice from the Microsoft Word document sent by Tony Allen from the QSAS team as part of the donation to PLplot. Added Paths: ----------- trunk/lib/qsastime/MJDtime.txt trunk/lib/qsastime/MJDtime.xml Added: trunk/lib/qsastime/MJDtime.txt =================================================================== --- trunk/lib/qsastime/MJDtime.txt (rev 0) +++ trunk/lib/qsastime/MJDtime.txt 2009-02-02 21:18:00 UTC (rev 9437) @@ -0,0 +1,313 @@ +MJDtime Routines + +QSAS Support Team +Cluster Science Centre, Imperial College +cs...@im... +Provided under gnu public licence + + +These routines convert between various date and time formats. The date and time is stored internally as a structure , MJDtime, containing an integer, as the integer part of the MJD date, and a double representing the seconds offset from the start of this day. Routines exist to also set and get MJD, JD, formatted date/time strings and NASA CDF epoch date/times from this structure. + +Modified Julian Date (MJD) measures days (and fractional days) since the start of 17 Nov 1858 CE in Universal Time (UTC). Julian Date (JD) measures days (and fractional days) since noon on 1 January, 4713 BCE in Universal Time (UTC). + +Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 + +Common Era (CE) and Before Common Era (BCE) are also often called AD and BC respectively. + +These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). In some routines the forceJulian flag can be set to 1 to override this and explicitly use the Julian calendar in conversions. The default value for forceJulian is 0 (do not force use of Julian Calendar). Note C libraries use Gregorian only from 14 Sept 1752 and will yield different results between years 1582 and 1752. + + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php +These routines have been compared with the results of the US Naval Observatory online converter. + + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and is safe. +Thus 2006-12-32 00:62:00.0 will be safely, and correctly, treated as 2007-01-01 01:02:00.0 + +MJD starts at 0h, so truncating MJD always gives the same day whatever the time of day (unlike JD). The seconds offset may take any value, so that any date/time may be expressed in terms of an offset from the same MJD day. The seconds field thus may exceed a single day, and may also be negative. + +typedef struct MJDtimeStruct +{ + int base_day; /* integer part of MJD */ + double time_sec; /* seconds from start of base_day */ + +}MJDtime; + + + + +Routines + +void setFromUT (int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); + +void setFromDOY (int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); + +void setFromBCE (int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); + +void setFromMJD (double ModifiedJulianDate, MJDtime *MJD); + +void setFromJD (double JulianDate, MJDtime *MJD); + +int setFromISOstring(const char* ISOstring, MJDtime *MJD); + +void setFromCDFepoch (double cdfepoch, MJDtime *MJD); + +void breakDownMJD (int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); + +double getMJD (MJDtime *MJD); + +double getJD (MJDtime *MJD); + +double getDiffDays (MJDtime *MJD1, MJDtime *MJD2); + +double getDiffSecs (MJDtime *MJD1, MJDtime *MJD2); + +double getCDFepoch (MJDtime *MJD); + +const char * getISOString (MJDtime *MJD, int delim); + +const char * getDayOfWeek (const MJDtime *MJD); + +const char * getLongDayOfWeek (const MJDtime *MJD); + +const char * getMonth (int m); + +const char * getLongMonth (int m); + +int getDOY (const MJDtime *MJD, int Julian); + +size_t strfMJD (char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); + + + + + + + + + + + +Detailed Descriptions + +#include <MJDtime.h> + +void setFromUT (int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); + +DESCRIPTION +The setFromUT() function constructs an MJDtime structure from the broken down year, month, day, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept 1752 onwards. + + +void setFromDOY (int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); + +DESCRIPTION +The setFromDOY() function constructs an MJDtime structure from the broken down year, day of year, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use the Gregorian calendar only from 14 Sept 1752 onwards. + + +void setFromBCE (int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); + +DESCRIPTION +The setFromBCE() function constructs an MJDtime structure from the broken down year (BCE), month, day, hour, minute and seconds. Note BCE years start from 0 CE, so year CE = 1 – year BCE. Julian Calendar is always used in setFromBCE(). + +void setFromMJD (double ModifiedJulianDate, MJDtime *MJD); + +DESCRIPTION +The setFromMJD() function constructs an MJDtime structure from Modified Julian Date as a double. MJD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC. + +void setFromJD (double JulianDate, MJDtime *MJD); + +DESCRIPTION +The setFromJD() function constructs an MJDtime structure from Julian Date as a double. JD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC. MJD = JD – 2400000.5 since JD starts at noon. + +int setFromISOstring(const char* ISOstring, MJDtime *MJD); + + +DESCRIPTION +The setFromISOstring() function constructs an MJDtime structure from an ISO standard format Date and time string in UTC. Gregorian Calendar is assumed from 15 Oct 1582. +The ISO format is of the form "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z". Both the ‘T’ separator and the trailing ‘Z’ are optional, and any number of decimal places after the seconds field are allowed. + +void setFromCDFepoch (double cdfepoch, MJDtime *MJD); + +DESCRIPTION +The setFromCDFepoch() function constructs an MJDtime structure from the NASA CDF Epoch as a double. CDF Epoch measures milliseconds from 0 CE (1 BCE) on the Gregorian Calendar. It is intended for use with space missions in the Common Era and will give misleading dates on the Julian Calendar. Much faster routines exist for handling conversion of CDF epochs to time strings in the modern restricted interval of applicability, but the algorithm here is consistent with the rest of the routines at all dates. + +void breakDownMJD (int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); + +DESCRIPTION +The brteakDownMJD() function converts an MJDtime structure into the broken down year, month, day, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept 1752 onwards. + +double getMJD (MJDtime *MJD); + +DESCRIPTION +The getMJD() function converts an MJDtime structure into a Modified Julian Date as a double. MJD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC. + +double getJD (MJDtime *MJD); + +DESCRIPTION +The getJD() function converts an MJDtime structure into a Julian Date as a double. JD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC. + +double getCDFepoch (MJDtime *MJD); + +DESCRIPTION +The getCDFepoch() function converts an MJDtime structure into the NASA CDF Epoch as a double. CDF Epoch measures milliseconds from 0 CE (1 BCE) on the Gregorian Calendar. It is intended for use with space missions in the Common Era and will give misleading dates on the Julian Calendar. Much faster routines exist for handling conversion of CDF epochs to time strings in the modern restricted interval of applicability, but the algorithm here is consistent with the rest of the routines at all dates. + +const char * getISOString (MJDtime *MJD, int delim); + +DESCRIPTION +The getISOString() function converts an MJDtime structure into an ISO date/time string measured in UTC. Uses the default change over date for Julian to Gregorian calendars, 15 Oct 1582. If delim is 1 then the ‘T’ and ‘Z’ delimiters are used, otherwise the date and time part are space separated. The resulting string is of the form +"1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z". +It returns a pointer to a static string and is therefore not thread safe. The returned string must be copied if it is to be retained beyond a repeat call, for example : +printf("%s Julian = %s Gregorian \n" , getISOString(&MJD1,1), getISOString(&MJD1,0)); +will use the same string twice rather than distinct strings. + +This is only a convenience utility for quick testing and simple use, and is equivalent to the (thread safe) strfMJD() call which is preferred for robust coding. The equivalent call would be … + char buf[360]; + strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%S%.Z", &MJD2, 0); +(note the decimal point before the final Z gives all available accuracy for the seconds fraction). +Also, for a specific accuracy, e.g. microseconds, use strfMJD() as in… +strfMJD(&(buf[0]), 360, "%Y-%m-%d %H:%M:%S%6", &MJD2, 0); + +double getDiffDays (MJDtime *MJD1, MJDtime *MJD2); + +DESCRIPTION +The getDiffDays() function returns the difference between two MJDtime structures measured in days as a double. The MJDtime structures do not need to have the same base day. + +double getDiffSecs (MJDtime *MJD1, MJDtime *MJD2); + +DESCRIPTION +The getDiffSecs() function returns the difference between two MJDtime structures measured in seconds as a double. The MJDtime structures do not need to have the same base day. + +const char * getDayOfWeek (const MJDtime *MJD); + +DESCRIPTION +The getDayOfWeek() function returns a char * pointer to a static null terminated string holding the short (3 character) text name for the day, in English, e.g. Mon, Tue, etc. + +const char * getLongDayOfWeek (const MJDtime *MJD); + +DESCRIPTION +The getLongDayOfWeek() function returns a char * pointer to a static null terminated string holding the full text name for the day, in English, e.g. Monday, Tuesday, etc. + +const char * getMonth (int m); + +DESCRIPTION +The getMonth() function returns a char * pointer to a static null terminated string holding the short (3 character) text name for the month, in English, e.g. Jan, Feb, etc. + +const char * getLongMonth (int m); + +DESCRIPTION +The getLongMonth() function returns a char * pointer to a static null terminated string holding the full text name for the month, in English, e.g. January, February, etc. + +int getDOY (const MJDtime *MJD, int forceJulian); + +DESCRIPTION +The getDOY() function returns the day of year as an int for the current day in the MJDtime structure MJD. If seconds are negative or hold more than one day the day is adjusted accordingly, thus it is not simply the doy for the integer part of the MJDtime structure. If the forceJulian flag is set to 1 the Julian calendar is used, otherwise the Gregorian calendar is used from the day following 4 Oct, 1582 (Julian) i.e. from 15 Oct, 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept, 1752 onwards. + +size_t strfMJD (char * buf, size_t len, const char * format, const MJDtime MJD); + +DESCRIPTION +The strfMJD () function formats the information from MJD into the +buffer buf according to the string pointed to by format using the formatting conventions of strftime(); + +The format string consists of zero or more conversion specifications and +ordinary characters. All ordinary characters are copied directly into +the buffer. A conversion specification consists of a percent sign +`%' and one other character. + +No more than len characters will be placed into the array, including the terminating NULL. strfMJD () returns the number of characters written into the array, not counting the terminating NULL. The output is truncated when len - 1 characters is reached. + +This routine differs from strftime() in that all date/times are in UTC and no locale or national variations in names are used. All names are returned in English. + +The conversion specifications are copied to the buffer after expansion as +follows:- + +%A is replaced by a representation of the full weekday name. + +%a is replaced by a representation of the abbreviated weekday name. + +%B is replaced by a representation of the full month name. + +%b is replaced by a representation of the abbreviated month name. + +%C is replaced by (year / 100) as decimal number; single digits are preceded by a zero. + +%c is replaced by a representation of time and date. + +%D is equivalent to ``%m/%d/%y''. + +%d is replaced by the day of the month as a decimal number (01-31). + +%e is replaced by the day of month as a decimal number (1-31); single digits are preceded by a blank. + +%F is equivalent to ``%Y-%m-%d''. + +%G is replaced by a year as a decimal number with century. This year is the one that contains the greater part of the week (Monday as the first day of the week). + +%g is replaced by the same year as in ``%G'', but as a decimal number without century (00-99). + +%H is replaced by the hour (24-hour clock) as a decimal number (00-23). + +%h the same as %b. + +%I is replaced by the hour (12-hour clock) as a decimal number (01-12). + +%j is replaced by the day of the year as a decimal number (001-366). + +%k is replaced by the hour (24-hour clock) as a decimal number (0-23); single digits are preceded by a blank. + +%l is replaced by the hour (12-hour clock) as a decimal number (1-12); single digits are preceded by a blank. + +%M is replaced by the minute as a decimal number (00-59). + +%m is replaced by the month as a decimal number (01-12). + +%n is replaced by a newline. + +%p is replaced by ‘AM’ or ‘PM’ as appropriate. + +%R is equivalent to ‘%H:%M’. + +%r is equivalent to ‘%I:%M:%S %p’. + +%S is replaced by the second as a decimal number (00-60). + +%s is replaced by the number of seconds since 1 Jan 1970, UTC. + +%T is equivalent to ‘%H:%M:%S’. + +%t is replaced by a tab. + +%U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number (00-53). + +%u is replaced by the weekday (Monday as the first day of the week) as a decimal number (1-7). + +%V is replaced by the week number of the year (Monday as the first day of the week) as a decimal number (01-53). If the week containing January 1 has four or more days in the new year, then it is week 1; otherwise it is the last week of the previous year, and the next week is week 1. + +%v is equivalent to ‘%e-%b-%Y’. + +%W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number (00-53). + +%w is replaced by the weekday (Sunday as the first day of the week) as a decimal number (0-6). + +%X is replaced by a representation of the time. + +%x is replaced by a representation of the date. + +%Y is replaced by the year with century as a decimal number. + +%y is replaced by the year without century as a decimal number (00-99). + +%Z is replaced by the time zone name. + +%z is replaced by the time zone offset from UTC; a leading plus sign stands for east of UTC, a minus sign for west of UTC, hours and minutes follow with two digits each and no delimiter between them (always gives ‘+0000’). + +%+ is replaced by a representation of the date and time of the form +Fri Jan 23 15:06:10 UTC 2009 + +%% is replaced by ‘%’. + +The following extra two option flags are also provided although they are not available in the strftime() routines. + +%(0-9) is replaced by the fractional part of the seconds field to the specified accuracy. Thus %S%3 would give seconds to millisecond accuracy (00.000). + +%. (decimal point) is replaced by the fractional part of the seconds field to available accuracy. Thus %S%. would give seconds with fractional part up to 9 decimal places if available. Spaces are removed from the end of the string but zeros are left. This may behave slightly differently on different platforms. + +All other flags are silently ignored and not printed. Property changes on: trunk/lib/qsastime/MJDtime.txt ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/lib/qsastime/MJDtime.xml =================================================================== --- trunk/lib/qsastime/MJDtime.xml (rev 0) +++ trunk/lib/qsastime/MJDtime.xml 2009-02-02 21:18:00 UTC (rev 9437) @@ -0,0 +1,318 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"> +<article lang=""> +<para>MJDtime Routines</para> +<para/> +<para>QSAS Support Team</para> +<para>Cluster Science Centre, Imperial College</para> +<para>csc...@im...</para> +<para>Provided under gnu public licence</para> +<para/> +<para> </para> +<para>These routines convert between various date and time formats. The date and time is stored internally as a structure , MJDtime, containing an integer, as the integer part of the MJD date, and a double representing the seconds offset from the start of this day. Routines exist to also set and get MJD, JD, formatted date/time strings and NASA CDF epoch date/times from this structure.</para> +<para/> +<para>Modified Julian Date (MJD) measures days (and fractional days) since the start of 17 Nov 1858 CE in Universal Time (UTC). Julian Date (JD) measures days (and fractional days) since noon on 1 January, 4713 BCE in Universal Time (UTC).</para> +<para/> +<para>Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5</para> +<para/> +<para>Common Era (CE) and Before Common Era (BCE) are also often called AD and BC respectively.</para> +<para/> +<para>These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). In some routines the forceJulian flag can be set to 1 to override this and explicitly use the Julian calendar in conversions. The default value for forceJulian is 0 (do not force use of Julian Calendar). Note C libraries use Gregorian only from 14 Sept 1752 and will yield different results between years 1582 and 1752.</para> +<para/> +<para> More detailed discussion can be found at <ulink url="http://aa.usno.navy.mil/data/docs/JulianDate.php">http://aa.usno.navy.mil/data/docs/JulianDate.php</ulink> +</para> +<para>These routines have been compared with the results of the US Naval Observatory online converter.</para> +<para> </para> +<para> In all routines, specifying a day, hour, minute or second field greater than would be valid is</para> +<para> handled with modulo arithmetic and is safe. </para> +<para>Thus 2006-12-32 00:62:00.0 will be safely, and correctly, treated as 2007-01-01 01:02:00.0 </para> +<para> </para> +<para>MJD starts at 0h, so truncating MJD always gives the same day whatever the time of day (unlike JD). The seconds offset may take any value, so that any date/time may be expressed in terms of an offset from the same MJD day. The seconds field thus may exceed a single day, and may also be negative.</para> +<para/> +<para>typedef struct MJDtimeStruct</para> +<para>{ </para> +<para> int base_day; /* integer part of MJD */</para> +<para> double time_sec; /* seconds from start of base_day */</para> +<para> </para> +<para>}MJDtime;</para> +<para/> +<para/> +<para/> +<para/> +<para>Routines</para> +<para/> +<para>void setFromUT (int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian);</para> +<para/> +<para>void setFromDOY (int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian);</para> +<para/> +<para>void setFromBCE (int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD);</para> +<para/> +<para>void setFromMJD (double ModifiedJulianDate, MJDtime *MJD);</para> +<para/> +<para>void setFromJD (double JulianDate, MJDtime *MJD);</para> +<para/> +<para>int setFromISOstring(const char* ISOstring, MJDtime *MJD);</para> +<para/> +<para>void setFromCDFepoch (double cdfepoch, MJDtime *MJD);</para> +<para/> +<para>void breakDownMJD (int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian);</para> +<para/> +<para>double getMJD (MJDtime *MJD);</para> +<para/> +<para>double getJD (MJDtime *MJD);</para> +<para/> +<para>double getDiffDays (MJDtime *MJD1, MJDtime *MJD2);</para> +<para/> +<para>double getDiffSecs (MJDtime *MJD1, MJDtime *MJD2);</para> +<para/> +<para>double getCDFepoch (MJDtime *MJD);</para> +<para/> +<para>const char * getISOString (MJDtime *MJD, int delim);</para> +<para/> +<para>const char * getDayOfWeek (const MJDtime *MJD);</para> +<para/> +<para>const char * getLongDayOfWeek (const MJDtime *MJD);</para> +<para/> +<para>const char * getMonth (int m);</para> +<para/> +<para>const char * getLongMonth (int m);</para> +<para/> +<para>int getDOY (const MJDtime *MJD, int Julian);</para> +<para/> +<para>size_t strfMJD (char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian);</para> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para/> +<para>Detailed Descriptions</para> +<para/> +<para>#include <MJDtime.h></para> +<para/> +<para>void setFromUT (int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromUT() function constructs an MJDtime structure from the broken down year, month, day, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept 1752 onwards.</para> +<para/> +<para/> +<para>void setFromDOY (int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromDOY() function constructs an MJDtime structure from the broken down year, day of year, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use the Gregorian calendar only from 14 Sept 1752 onwards.</para> +<para/> +<para/> +<para>void setFromBCE (int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromBCE() function constructs an MJDtime structure from the broken down year (BCE), month, day, hour, minute and seconds. Note BCE years start from 0 CE, so year CE = 1 – year BCE. Julian Calendar is always used in setFromBCE().</para> +<para/> +<para>void setFromMJD (double ModifiedJulianDate, MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromMJD() function constructs an MJDtime structure from Modified Julian Date as a double. MJD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC.</para> +<para/> +<para>void setFromJD (double JulianDate, MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromJD() function constructs an MJDtime structure from Julian Date as a double. JD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC. MJD = JD – 2400000.5 since JD starts at noon.</para> +<para/> +<para>int setFromISOstring(const char* ISOstring, MJDtime *MJD);</para> +<para/> +<para/> +<para>DESCRIPTION</para> +<para>The setFromISOstring() function constructs an MJDtime structure from an ISO standard format Date and time string in UTC. Gregorian Calendar is assumed from 15 Oct 1582.</para> +<para>The ISO format is of the form "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z". Both the ‘T’ separator and the trailing ‘Z’ are optional, and any number of decimal places after the seconds field are allowed.</para> +<para/> +<para>void setFromCDFepoch (double cdfepoch, MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The setFromCDFepoch() function constructs an MJDtime structure from the NASA CDF Epoch as a double. CDF Epoch measures milliseconds from 0 CE (1 BCE) on the Gregorian Calendar. It is intended for use with space missions in the Common Era and will give misleading dates on the Julian Calendar. Much faster routines exist for handling conversion of CDF epochs to time strings in the modern restricted interval of applicability, but the algorithm here is consistent with the rest of the routines at all dates.</para> +<para/> +<para>void breakDownMJD (int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian);</para> +<para/> +<para>DESCRIPTION</para> +<para>The brteakDownMJD() function converts an MJDtime structure into the broken down year, month, day, hour, minute and seconds. If the forceJulian flag is 1 the Julian Calendar is used whatever the date, otherwise the Gregorian calendar is used from the day following 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept 1752 onwards.</para> +<para/> +<para>double getMJD (MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getMJD() function converts an MJDtime structure into a Modified Julian Date as a double. MJD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC.</para> +<para/> +<para>double getJD (MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getJD() function converts an MJDtime structure into a Julian Date as a double. JD is calendar independent and forms a continuous sequence of days and fractions of days. Time is measured in UTC.</para> +<para/> +<para>double getCDFepoch (MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getCDFepoch() function converts an MJDtime structure into the NASA CDF Epoch as a double. CDF Epoch measures milliseconds from 0 CE (1 BCE) on the Gregorian Calendar. It is intended for use with space missions in the Common Era and will give misleading dates on the Julian Calendar. Much faster routines exist for handling conversion of CDF epochs to time strings in the modern restricted interval of applicability, but the algorithm here is consistent with the rest of the routines at all dates.</para> +<para/> +<para>const char * getISOString (MJDtime *MJD, int delim);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getISOString() function converts an MJDtime structure into an ISO date/time string measured in UTC. Uses the default change over date for Julian to Gregorian calendars, 15 Oct 1582. If delim is 1 then the ‘T’ and ‘Z’ delimiters are used, otherwise the date and time part are space separated. The resulting string is of the form </para> +<para>"1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z". </para> +<para>It returns a pointer to a static string and is therefore not thread safe. The returned string must be copied if it is to be retained beyond a repeat call, for example :</para> +<para>printf("%s Julian = %s Gregorian \n" , getISOString(&MJD1,1), getISOString(&MJD1,0));</para> +<para>will use the same string twice rather than distinct strings.</para> +<para/> +<para>This is only a convenience utility for quick testing and simple use, and is equivalent to the (thread safe) strfMJD() call which is preferred for robust coding. The equivalent call would be …</para> +<para> char buf[360];</para> +<para> strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%S%.Z", &MJD2, 0);</para> +<para>(note the decimal point before the final Z gives all available accuracy for the seconds fraction). </para> +<para>Also, for a specific accuracy, e.g. microseconds, use strfMJD() as in…</para> +<para>strfMJD(&(buf[0]), 360, "%Y-%m-%d %H:%M:%S%6", &MJD2, 0);</para> +<para/> +<para>double getDiffDays (MJDtime *MJD1, MJDtime *MJD2);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getDiffDays() function returns the difference between two MJDtime structures measured in days as a double. The MJDtime structures do not need to have the same base day.</para> +<para/> +<para>double getDiffSecs (MJDtime *MJD1, MJDtime *MJD2);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getDiffSecs() function returns the difference between two MJDtime structures measured in seconds as a double. The MJDtime structures do not need to have the same base day.</para> +<para/> +<para>const char * getDayOfWeek (const MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getDayOfWeek() function returns a char * pointer to a static null terminated string holding the short (3 character) text name for the day, in English, e.g. Mon, Tue, etc.</para> +<para/> +<para>const char * getLongDayOfWeek (const MJDtime *MJD);</para> +<para/> +<para>DESCRIPTION </para> +<para>The getLongDayOfWeek() function returns a char * pointer to a static null terminated string holding the full text name for the day, in English, e.g. Monday, Tuesday, etc.</para> +<para/> +<para>const char * getMonth (int m);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getMonth() function returns a char * pointer to a static null terminated string holding the short (3 character) text name for the month, in English, e.g. Jan, Feb, etc.</para> +<para/> +<para>const char * getLongMonth (int m);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getLongMonth() function returns a char * pointer to a static null terminated string holding the full text name for the month, in English, e.g. January, February, etc.</para> +<para/> +<para>int getDOY (const MJDtime *MJD, int forceJulian);</para> +<para/> +<para>DESCRIPTION</para> +<para>The getDOY() function returns the day of year as an int for the current day in the MJDtime structure MJD. If seconds are negative or hold more than one day the day is adjusted accordingly, thus it is not simply the doy for the integer part of the MJDtime structure. If the forceJulian flag is set to 1 the Julian calendar is used, otherwise the Gregorian calendar is used from the day following 4 Oct, 1582 (Julian) i.e. from 15 Oct, 1582 (Gregorian). Note C libraries use Gregorian only from 14 Sept, 1752 onwards.</para> +<para/> +<para>size_t strfMJD (char * buf, size_t len, const char * format, const MJDtime MJD);</para> +<para/> +<para>DESCRIPTION</para> +<para>The strfMJD () function formats the information from MJD into the</para> +<para>buffer buf according to the string pointed to by format using the formatting conventions of strftime();</para> +<para/> +<para>The format string consists of zero or more conversion specifications and</para> +<para>ordinary characters. All ordinary characters are copied directly into</para> +<para>the buffer. A conversion specification consists of a percent sign</para> +<para>`%' and one other character.</para> +<para/> +<para>No more than len characters will be placed into the array, including the terminating NULL. strfMJD () returns the number of characters written into the array, not counting the terminating NULL. The output is truncated when len - 1 characters is reached.</para> +<para/> +<para>This routine differs from strftime() in that all date/times are in UTC and no locale or national variations in names are used. All names are returned in English.</para> +<para/> +<para>The conversion specifications are copied to the buffer after expansion as</para> +<para>follows:-</para> +<para/> +<para>%A is replaced by a representation of the full weekday name.</para> +<para/> +<para>%a is replaced by a representation of the abbreviated weekday name.</para> +<para/> +<para>%B is replaced by a representation of the full month name.</para> +<para/> +<para>%b is replaced by a representation of the abbreviated month name.</para> +<para/> +<para>%C is replaced by (year / 100) as decimal number; single digits are preceded by a zero.</para> +<para/> +<para>%c is replaced by a representation of time and date.</para> +<para/> +<para>%D is equivalent to ``%m/%d/%y''.</para> +<para/> +<para>%d is replaced by the day of the month as a decimal number (01-31).</para> +<para/> +<para>%e is replaced by the day of month as a decimal number (1-31); single digits are preceded by a blank.</para> +<para/> +<para>%F is equivalent to ``%Y-%m-%d''.</para> +<para/> +<para>%G is replaced by a year as a decimal number with century. This year is the one that contains the greater part of the week (Monday as the first day of the week).</para> +<para/> +<para>%g is replaced by the same year as in ``%G'', but as a decimal number without century (00-99).</para> +<para/> +<para>%H is replaced by the hour (24-hour clock) as a decimal number (00-23).</para> +<para/> +<para>%h the same as %b.</para> +<para/> +<para>%I is replaced by the hour (12-hour clock) as a decimal number (01-12).</para> +<para/> +<para>%j is replaced by the day of the year as a decimal number (001-366).</para> +<para/> +<para>%k is replaced by the hour (24-hour clock) as a decimal number (0-23); single digits are preceded by a blank.</para> +<para/> +<para>%l is replaced by the hour (12-hour clock) as a decimal number (1-12); single digits are preceded by a blank.</para> +<para/> +<para>%M is replaced by the minute as a decimal number (00-59).</para> +<para/> +<para>%m is replaced by the month as a decimal number (01-12).</para> +<para/> +<para>%n is replaced by a newline.</para> +<para/> +<para>%p is replaced by ‘AM’ or ‘PM’ as appropriate.</para> +<para/> +<para>%R is equivalent to ‘%H:%M’.</para> +<para/> +<para>%r is equivalent to ‘%I:%M:%S %p’.</para> +<para/> +<para>%S is replaced by the second as a decimal number (00-60).</para> +<para/> +<para>%s is replaced by the number of seconds since 1 Jan 1970, UTC.</para> +<para/> +<para>%T is equivalent to ‘%H:%M:%S’.</para> +<para/> +<para>%t is replaced by a tab.</para> +<para/> +<para>%U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number (00-53).</para> +<para/> +<para>%u is replaced by the weekday (Monday as the first day of the week) as a decimal number (1-7).</para> +<para/> +<para>%V is replaced by the week number of the year (Monday as the first day of the week) as a decimal number (01-53). If the week containing January 1 has four or more days in the new year, then it is week 1; otherwise it is the last week of the previous year, and the next week is week 1.</para> +<para/> +<para>%v is equivalent to ‘%e-%b-%Y’.</para> +<para/> +<para>%W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number (00-53).</para> +<para/> +<para>%w is replaced by the weekday (Sunday as the first day of the week) as a decimal number (0-6).</para> +<para/> +<para>%X is replaced by a representation of the time.</para> +<para/> +<para>%x is replaced by a representation of the date.</para> +<para/> +<para>%Y is replaced by the year with century as a decimal number.</para> +<para/> +<para>%y is replaced by the year without century as a decimal number (00-99).</para> +<para/> +<para>%Z is replaced by the time zone name.</para> +<para/> +<para>%z is replaced by the time zone offset from UTC; a leading plus sign stands for east of UTC, a minus sign for west of UTC, hours and minutes follow with two digits each and no delimiter between them (always gives ‘+0000’).</para> +<para/> +<para>%+ is replaced by a representation of the date and time of the form </para> +<para>Fri Jan 23 15:06:10 UTC 2009</para> +<para/> +<para>%% is replaced by ‘%’.</para> +<para/> +<para>The following extra two option flags are also provided although they are not available in the strftime() routines.</para> +<para/> +<para>%(0-9) is replaced by the fractional part of the seconds field to the specified accuracy. Thus %S%3 would give seconds to millisecond accuracy (00.000).</para> +<para/> +<para>%. (decimal point) is replaced by the fractional part of the seconds field to available accuracy. Thus %S%. would give seconds with fractional part up to 9 decimal places if available. Spaces are removed from the end of the string but zeros are left. This may behave slightly differently on different platforms.</para> +<para/> +<para>All other flags are silently ignored and not printed.</para> +</article> Property changes on: trunk/lib/qsastime/MJDtime.xml ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-02-03 12:35:34
|
Revision: 9442 http://plplot.svn.sourceforge.net/plplot/?rev=9442&view=rev Author: andrewross Date: 2009-02-03 12:35:31 +0000 (Tue, 03 Feb 2009) Log Message: ----------- Fix some minor issues with qsastime library: %+ is non-standard. Replace with standard format characters (%a %b %e %H:%M:%S UTC %Y) %v is non-standard. Replace with standard %e-%b-%Y. Can't use 0 and - to zero pad and left align output from sprintf as they class. Drop zero padding. Explicitly cast size_t type to int in printf statement. This is just a number of characters so int will always be big enough. Could use %z format string on Linux, but this is not entirely standard. These changes remove gcc warning messages. Also, it doesn't make sense to use %g for formatting the number of seconds. Change to %f. To see why this doesn't work set sec = 1.234E-10 in MJDtime_test.c. Modified Paths: -------------- trunk/lib/qsastime/MJDtime.c trunk/lib/qsastime/MJDtime_test.c Modified: trunk/lib/qsastime/MJDtime.c =================================================================== --- trunk/lib/qsastime/MJDtime.c 2009-02-03 06:32:28 UTC (rev 9441) +++ trunk/lib/qsastime/MJDtime.c 2009-02-03 12:35:31 UTC (rev 9442) @@ -527,9 +527,9 @@ if(delim == 1) { if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02dT%02d:%02d:%01d%-011.10g", y, m, d, hour, min, sec1, sec ); + sprintf(DateTime, "%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); else - sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-011.10g", y, m, d, hour, min, sec1, sec ); + sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); /* remove trailing white space */ char * ptr; @@ -539,9 +539,9 @@ else { if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02d %02d:%02d:%01d%-011.10g", y, m, d, hour, min, sec1, sec ); + sprintf(DateTime, "%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); else - sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-011.10g", y, m, d, hour, min, sec1, sec ); + sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); } return &(DateTime[0]); Modified: trunk/lib/qsastime/MJDtime_test.c =================================================================== --- trunk/lib/qsastime/MJDtime_test.c 2009-02-03 06:32:28 UTC (rev 9441) +++ trunk/lib/qsastime/MJDtime_test.c 2009-02-03 12:35:31 UTC (rev 9442) @@ -113,13 +113,13 @@ size_t used = strfMJD(&(buf[0]), 360, " strfMJD():\n --------\n '%+' \n %c\n %D %F \n %j \n %r \n %s \n %v\n\n", &MJD2, 0); - printf("chars %d for \n%s\n" , used, buf); + printf("chars %d for \n%s\n" , (int) used, buf); /* seconds since 01 Jan 1970 Gregorian for strftime use */ time_t localt = MJD2.time_sec + (MJD2.base_day - 40587) * 86400; struct tm *ptm; ptm = gmtime(&localt); - strftime(&(buf[0]), 360, " strftime(): (invalid before 1970)\n ------\n '%+' \n %c\n %D %F \n %j \n %r \n %s \n %v", ptm); + strftime(&(buf[0]), 360, " strftime(): (invalid before 1970)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); printf("%s\n" , buf); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-04 02:40:57
|
Revision: 9444 http://plplot.svn.sourceforge.net/plplot/?rev=9444&view=rev Author: airwin Date: 2009-02-04 02:40:51 +0000 (Wed, 04 Feb 2009) Log Message: ----------- Add visibility infrastructure for libqsastime. This result works on Linux with the -fvisibility=hidden option for gcc, g++, and gfortran, but it also needs to be tested on other platforms (especially Windows). Modified Paths: -------------- trunk/lib/qsastime/MJDtime.h Added Paths: ----------- trunk/lib/qsastime/qsastimedll.h Modified: trunk/lib/qsastime/MJDtime.h =================================================================== --- trunk/lib/qsastime/MJDtime.h 2009-02-03 13:45:19 UTC (rev 9443) +++ trunk/lib/qsastime/MJDtime.h 2009-02-04 02:40:51 UTC (rev 9444) @@ -41,7 +41,10 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +/* include header file for dll definitions */ + #include "qsastimedll.h" + typedef struct MJDtimeStruct { /* @@ -55,25 +58,23 @@ }MJDtime; -void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); -void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); -void setFromCDFepoch(double cdfepoch, MJDtime *MJD); -void setFromJD(double JulianDate, MJDtime *MJD); -int setFromISOstring(const char* ISOstring, MJDtime *MJD); -void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); -double getMJD(MJDtime *MJD); -double getJD(MJDtime *MJD); -double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); -double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); -double getCDFepoch(MJDtime *MJD); -const char * getISOString(MJDtime *MJD, int delim); -const char * getDayOfWeek(const MJDtime *MJD); -const char * getLongDayOfWeek( const MJDtime *MJD); -const char * getMonth(int m); -const char * getLongMonth(int m); -int getDOY(const MJDtime *MJD, int forceJulian); -size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); - - +QSASTIMEDLLIMPEXP void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromCDFepoch(double cdfepoch, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromJD(double JulianDate, MJDtime *MJD); +QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD); +QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP double getMJD(MJDtime *MJD); +QSASTIMEDLLIMPEXP double getJD(MJDtime *MJD); +QSASTIMEDLLIMPEXP double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); +QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); +QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); +QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getMonth(int m); +QSASTIMEDLLIMPEXP const char * getLongMonth(int m); +QSASTIMEDLLIMPEXP int getDOY(const MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); Added: trunk/lib/qsastime/qsastimedll.h =================================================================== --- trunk/lib/qsastime/qsastimedll.h (rev 0) +++ trunk/lib/qsastime/qsastimedll.h 2009-02-04 02:40:51 UTC (rev 9444) @@ -0,0 +1,44 @@ +#ifndef __QSASTIME_DLL_H +#define __QSASTIME_DLL_H + +#ifdef USINGDLL + #if defined(WIN32) + /* Visual C/C++, Borland, MinGW and Watcom */ + #if defined(__VISUALC__) || defined(_MSC_VER) || defined(__BORLANDC__) || defined(__GNUC__) || defined(__WATCOMC__) + #define QSASTIMEDLLEXPORT __declspec(dllexport) + #define QSASTIMEDLLIMPORT __declspec(dllimport) + #else + #define QSASTIMEDLLEXPORT + #define QSASTIMEDLLIMPORT + #endif + #elif defined(__CYGWIN__) + #define QSASTIMEDLLEXPORT __declspec(dllexport) + #define QSASTIMEDLLIMPORT __declspec(dllimport) + #elif defined(__GNUC__) && __GNUC__ > 3 + /* Follow ideas in http://gcc.gnu.org/wiki/Visibility for GCC version 4.x + * The following forces exported symbols specifically designated with + * QSASTIMEDLLEXPORT to be visible. */ + #define QSASTIMEDLLEXPORT __attribute__ ((visibility("default"))) + #define QSASTIMEDLLIMPORT + #endif +#endif + +/* For an unknown compiler or static built we clear the macros */ +#ifndef QSASTIMEDLLEXPORT +# define QSASTIMEDLLEXPORT +# define QSASTIMEDLLIMPORT +#endif + +/* The IMPEXP macros will always be set to DLLIMPORT (even for + the static library, but DLLIMPORT is empty in this case). If + cmake sets the corresponding macro xxxx_EXPORTS if the + corresponding library is built DLLIMPEXP is set to DLLEXPORT */ +#if defined(qsastime_EXPORTS) + #define QSASTIMEDLLIMPEXP QSASTIMEDLLEXPORT + #define QSASTIMEDLLIMPEXP_DATA(type) QSASTIMEDLLEXPORT type +#else + #define QSASTIMEDLLIMPEXP QSASTIMEDLLIMPORT + #define QSASTIMEDLLIMPEXP_DATA(type) QSASTIMEDLLIMPORT type +#endif + +#endif /* __QSASTIME_DLL_H */ Property changes on: trunk/lib/qsastime/qsastimedll.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-04 08:04:39
|
Revision: 9447 http://plplot.svn.sourceforge.net/plplot/?rev=9447&view=rev Author: airwin Date: 2009-02-04 08:04:36 +0000 (Wed, 04 Feb 2009) Log Message: ----------- Specify correct (LGPL) licensing terms. Modified Paths: -------------- trunk/lib/qsastime/MJDtime.txt trunk/lib/qsastime/MJDtime.xml Modified: trunk/lib/qsastime/MJDtime.txt =================================================================== --- trunk/lib/qsastime/MJDtime.txt 2009-02-04 05:35:13 UTC (rev 9446) +++ trunk/lib/qsastime/MJDtime.txt 2009-02-04 08:04:36 UTC (rev 9447) @@ -3,7 +3,7 @@ QSAS Support Team Cluster Science Centre, Imperial College csc...@im... -Provided under gnu public licence +Provided under library gnu public licence (LGPL). These routines convert between various date and time formats. The date and time is stored internally as a structure , MJDtime, containing an integer, as the integer part of the MJD date, and a double representing the seconds offset from the start of this day. Routines exist to also set and get MJD, JD, formatted date/time strings and NASA CDF epoch date/times from this structure. Modified: trunk/lib/qsastime/MJDtime.xml =================================================================== --- trunk/lib/qsastime/MJDtime.xml 2009-02-04 05:35:13 UTC (rev 9446) +++ trunk/lib/qsastime/MJDtime.xml 2009-02-04 08:04:36 UTC (rev 9447) @@ -6,7 +6,7 @@ <para>QSAS Support Team</para> <para>Cluster Science Centre, Imperial College</para> <para>csc...@im...</para> -<para>Provided under gnu public licence</para> +<para>Provided under library gnu public licence (LGPL)</para> <para/> <para> </para> <para>These routines convert between various date and time formats. The date and time is stored internally as a structure , MJDtime, containing an integer, as the integer part of the MJD date, and a double representing the seconds offset from the start of this day. Routines exist to also set and get MJD, JD, formatted date/time strings and NASA CDF epoch date/times from this structure.</para> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-05 00:34:18
|
Revision: 9452 http://plplot.svn.sourceforge.net/plplot/?rev=9452&view=rev Author: airwin Date: 2009-02-05 00:34:15 +0000 (Thu, 05 Feb 2009) Log Message: ----------- Rename all file names from the MJDtime version to the qsastime version. Added Paths: ----------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime.html trunk/lib/qsastime/qsastime.txt trunk/lib/qsastime/qsastime.xml trunk/lib/qsastime/qsastime_test.c Removed Paths: ------------- trunk/lib/qsastime/MJDtime.c trunk/lib/qsastime/MJDtime.h trunk/lib/qsastime/MJDtime.html trunk/lib/qsastime/MJDtime.txt trunk/lib/qsastime/MJDtime.xml trunk/lib/qsastime/MJDtime_test.c Deleted: trunk/lib/qsastime/MJDtime.c =================================================================== --- trunk/lib/qsastime/MJDtime.c 2009-02-04 23:11:59 UTC (rev 9451) +++ trunk/lib/qsastime/MJDtime.c 2009-02-05 00:34:15 UTC (rev 9452) @@ -1,1085 +0,0 @@ -/* - This software originally contributed under the LGPL in January 2009 to - PLplot by the - Cluster Science Centre - QSAS team, - Imperial College, London - Copyright (C) 2009 Imperial College, London - - This file is part of PLplot. - - PLplot is free software; you can redistribute it and/or modify - it under the terms of the GNU General Library Public License as published - by the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - PLplot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with PLplot; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - - /* MJD measures from the start of 17 Nov 1858 */ - - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam - Note C libraries use Gregorian only from 14 Sept 1752 - More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php - These routines have been compared with the results of the US Naval Observatory online converter. - Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - - In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - - */ - -#include <MJDtime.h> - -double MJDtoJD = 2400000.5; -double SecInDay = 86400; /* we ignore leap seconds */ -int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ -const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; -const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; - -void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) -{ - /* convert Gregorian date plus time to MJD */ - /* MJD measures from the start of 17 Nov 1858 */ - - /* the int flag Julian forces use of Julian calendar whatever the year */ - /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ - /* Note C libraries use Gregorian only from 14 Sept 1752 onwards */ - - if(year <= 0) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - - int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ - if(year%4 == 0) - MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678943; - else - MJD->base_day = year * 365 + leaps + MonthStartDOY[month-1] + day - 678943; - - } - else if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - - int leaps = (year -1 ) / 4; - if(year%4 == 0) - MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678943; - else - MJD->base_day = year * 365 + leaps + MonthStartDOY[month-1] + day - 678943; - } - else - { - /* count leap years Gregorian Calendar - modern dates */ - /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ - /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - - int lastyear = year - 1; - int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; - if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) - MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678941; - else - MJD->base_day = year * 365 + leaps + MonthStartDOY[month-1] + day - 678941; - - } - - MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; - - if(MJD->time_sec >= SecInDay) - { - int extraDays = (int) (MJD->time_sec / SecInDay); - MJD->base_day += extraDays; - MJD->time_sec -= extraDays * SecInDay; - } - - return; -} - - -int setFromISOstring(const char* ISOstring, MJDtime *MJD) -{ - double seconds; - int y, m, d, h, min; - char* ptr; - int startAt=0; - int len = strlen(ISOstring); - - /* ISO is "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z" */ - - /* parse off year */ - - y = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 5; - if(startAt > len) return 1; - - m = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - d = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - h = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - min = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - seconds = strtod(&(ISOstring[startAt]), NULL); - setFromUT(y, m, d, h, min, seconds, MJD, 0); - - return 0; -} - - -void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian) -{ - /* Set from Day Of Year format */ - - /* convert Gregorian date plus time to MJD */ - /* MJD measures from the start of 17 Nov 1858 */ - - /* the int flag forceJulian forces use of Julian calendar whatever the year */ - /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ - /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ - - if(year <= 0) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - - int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ - MJD->base_day = year * 365 + leaps + doy - 678943; - - } - else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - - int leaps = (year -1 ) / 4; - MJD->base_day = year * 365 + leaps + doy - 678943; - - } - else - { - /* count leap years Gregorian Calendar - modern dates */ - /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ - /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - - int lastyear = year - 1; - int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; - MJD->base_day = year * 365 + leaps + doy - 678941; - - } - - MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; - - if(MJD->time_sec >= SecInDay) - { - int extraDays = (int) (MJD->time_sec / SecInDay); - MJD->base_day += extraDays; - MJD->time_sec -= extraDays * SecInDay; - } - - return; - -} - - -void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD) -{ - /* utility to allow user to input dates BCE (BC) */ - - int year = 1 - yearBCE; - setFromUT(year, month, day, hour, min, sec, MJD, 0); - -} - -void setFromMJD(double ModifiedJulianDate, MJDtime *MJD) -{ - /* convert MJD double into MJD structure */ - MJD->base_day = (int) ModifiedJulianDate; - MJD->time_sec = (ModifiedJulianDate - MJD->base_day) * SecInDay; -} - -void setFromJD(double JulianDate, MJDtime *MJD) -{ - /* break JD double into MJD based structure - Note Julian Day starts Noon, so convert to MJD first */ - - MJD->base_day = (int) (JulianDate - MJDtoJD) ; - MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; -} - -void setFromCDFepoch(double cdfepoch, MJDtime *MJD){ - - /* convert cdf epoch double into MJD structure - Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ - - double seconds = cdfepoch * 0.001; - - MJD->base_day = (int) (seconds / 86400.0); - MJD->time_sec = seconds - MJD->base_day * SecInDay; - MJD->base_day -= 678941; - -} - -double getCDFepoch(MJDtime *MJD){ - - /* convert MJD structure into cdf epoch double - Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ - - int days = MJD->base_day + 678941; - double seconds = days * SecInDay + MJD->time_sec; - return seconds * 1000.; -} - -const char * getDayOfWeek( const MJDtime *MJD) -{ - static char *dow = {"Wed\0Thu\0Fri\0Sat\0Sun\0Mon\0Tue"}; - int d = MJD->base_day % 7; - return &(dow[d*4]); -} - -const char * getLongDayOfWeek( const MJDtime *MJD) -{ - static char *dow = {"Wednesday\0Thursday\0\0Friday\0\0\0\0Saturday\0\0Sunday\0\0\0\0Monday\0\0\0\0Tuesday"}; - int d = MJD->base_day % 7; - return &(dow[d*10]); -} - -const char * getMonth( int m) -{ - static char *months = {"Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"}; - return &(months[(m-1)*4]); -} - -const char * getLongMonth( int m) -{ - static char *months = {"January\0\0\0February\0\0March\0\0\0\0\0April\0\0\0\0\0May\0\0\0\0\0\0\0June\0\0\0\0\0\0July\0\0\0\0\0\0August\0\0\0\0September\0October\0\0\0November\0\0December"}; - return &(months[(m-1)*10]); -} - - -int getDOY(const MJDtime *MJD, int forceJulian) -{ - /* Get from Day Of Year */ - int doy, year; - - int extra_days; - - if(MJD->time_sec >= 0) - { - extra_days = (int) (MJD->time_sec / SecInDay); - } - else - { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } - - - int j = MJD->base_day + extra_days; - - if( j <= -678943) { - - /* BCE dates */ - - j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - year = (int) ((float)j / 365.25) -1; - doy = j - (int)(year * 365.25); - } - - } - else if( j < -100840 || forceJulian == 1) - { - /* Julian Dates */ - j += 678943; - - year = (int) ((float)j / 365.25); - - doy = j - (int)(year * 365.25); - - } - else - { - /* Gregorian Dates */ - j += 678941; - - year = (int) ((float)j / 365.2425); - int lastyear = year - 1; - doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - - } - - return doy; -} - - -void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian) -{ - /* Convert MJD struct into date/time elements */ - /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ - /* There are 678943 days from year 0 to MJD(0) */ - - int extra_days; - - if(MJD->time_sec >= 0) - { - extra_days = (int) (MJD->time_sec / SecInDay); - } - else - { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } - - - int j = MJD->base_day + extra_days; - - if( j <= -678943) { - - /* BCE dates */ - - j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - *year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - *year = (int) ((float)j / 365.25) -1; - j = j - (int)((*year) * 365.25); - } - - /* j is now always positive */ - *month = 0; - - if(*year%4 != 0) - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - else - { - /* put this year's leap day back as it is done here */ - j++; - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } - } - else if( j < -100840 || forceJulian == 1) - { - /* Julian Dates */ - j += 678943; - - *year = (int) ((float)j / 365.25); - - j = j - (int)(*year * 365.25); - - *month = 0; - if(*year%4 != 0) - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - else - { - /* put leap day back for this year as done here */ - j++; - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } - } - else - { - /* Gregorian Dates */ - j += 678941; - - *year = (int) ((float)j / 365.2425); - int lastyear = *year - 1; - j = j - *year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - - *month = 0; - if((*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0) ) - { - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } - else - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - - } - - /* Time part */ - - double seconds = MJD->time_sec - extra_days * SecInDay; - *hour = (int)( seconds / 3600.); - seconds -= (double) *hour * 3600.; - *min = (int) ( seconds / 60.); - *sec = seconds - (double) *min * 60.; -} - -double getMJD(MJDtime *MJD) -{ - /* Return MJD as a double */ - return (double) MJD->base_day + MJD->time_sec / SecInDay ; -} - -double getJD(MJDtime *MJD) -{ - /* Return JD as a double */ - double JD = getMJD(MJD) + MJDtoJD; - return JD; -} - -double getDiffDays(MJDtime *MJD1, MJDtime *MJD2) -{ - /* Return difference MJD1 - MJD2 in days as a double */ - double diff = (double)(MJD1->base_day - MJD1->base_day) + (MJD1->time_sec - MJD1->time_sec) / SecInDay; - return diff; -} - -double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2) -{ - /* Return difference MJD1 - MJD2 in seconds as a double */ - double diff = (double)(MJD1->base_day - MJD1->base_day) * SecInDay + (MJD1->time_sec - MJD1->time_sec) ; - return diff; -} - -const char * getISOString(MJDtime* MJD, int delim) -{ - /* ISO time string for UTC */ - /* uses default behaviour for Julian/Gregorian switch over */ - static char DateTime[50]; - int y, m, d, hour, min; - int sec1, ysign; - double sec; - int slen; - - breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, 0); - - if(y < 0) - { - ysign = 1; - y=-y; - } - else ysign = 0; - - sec1 = (int)sec/10; - sec -= (double) sec1*10; - - if(delim == 1) - { - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - else - sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - - /* remove trailing white space */ - char * ptr; - while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; - strcat(&(DateTime[0]), "Z"); - } - else - { - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - else - sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - - /* remove trailing white space */ - char * ptr; - slen = strlen(DateTime)-1; - while( DateTime[slen] == ' ') - { - DateTime[slen] ='\0'; - slen--; - } - - } - return &(DateTime[0]); -} - - - -size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian) -{ - /* Format a text string according to the format string. - Uses the same syntax as strftime() but does not use current locale. - The null terminator is included in len for safety. */ - - int year, month, day, hour, min, ysign, sec1, sec_fract, second; - int i, count; - int nplaces, slen; - char * ptr; - double sec; - const char *dayText; - const char *monthText; - char DateTime[80]; - size_t posn = 0; - size_t last = len -1; - buf[last] = '\0'; - buf[0] = '\0'; /* force overwrite of old buffer since strnctat() used hereafter */ - - breakDownMJD(&year, &month, &day, &hour, &min, &sec, MJD, forceJulian); - if(year < 0) - { - ysign = 1; - year =- year; - } - else ysign = 0; - - second = (int) sec; - sec1 = (int)sec/10; - sec -= (double) sec1*10; - - /* Read format string, character at a time */ - i=0; - while(i<strlen(format)) - { - char next = format[i]; - if( next == '%') - { - /* format character or escape */ - i++; - next = format[i]; - if(next == '%') - { - /* escaped %, pass it on */ - buf[posn] = next; - posn++; - if(posn >= last) return posn; - } - else if(next == 'a') - { - /* short day name */ - dayText = getDayOfWeek(MJD); - strncat(&(buf[posn]), dayText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'A') - { - /* long day name */ - dayText = getLongDayOfWeek(MJD); - strncat(&(buf[posn]), dayText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'b' || next == 'h') - { - /* short month name */ - monthText = getMonth(month); - strncat(&(buf[posn]), monthText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'B') - { - /* long month name */ - monthText = getLongMonth(month); - strncat(&(buf[posn]), monthText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'c') - { - /* Date and Time with day of week */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d %04d", dayText, monthText, day, hour, min, second, year ); - else - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d -%04d", dayText, monthText, day, hour, min, second, year ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'C') - { - /* year / 100 so, e.g. 1989 is 20th century but comes out as 19 */ - int century = year / 100; - if(ysign == 0) - sprintf(DateTime, "%02d", century ); - else - sprintf(DateTime, "-%02d", century+1 ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'd') - { - /* day of month (01 - 31) */ - sprintf(DateTime, "%02d", day); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'D') - { - /* month/day/year */ - int y = year %100; - if(ysign == 0) - sprintf(DateTime, "%02d/%02d/%02d", month, day, y ); - else - sprintf(DateTime, "%02d/%02d/-%02d", month, day, y ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'e') - { - /* day of month ( 1 - 31) */ - if(day < 10) - sprintf(DateTime, " %01d", day); - else - sprintf(DateTime, "%02d", day); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'F') - { - /* year-month-day */ - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02d", year, month, day ); - else - sprintf(DateTime, "-%04d-%02d-%02d", year, month, day ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'H') - { - /* hour, 24 hour clock (00 - 23) */ - sprintf(DateTime, "%02d", hour); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'I') - { - /* hour, 12 hour clock (01 - 12) */ - if(hour == 0) sprintf(DateTime, "%02d", hour+12); - else if(hour > 12) sprintf(DateTime, "%02d", hour-12); - else sprintf(DateTime, "%02d", hour); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'j') - { - /* day of year */ - int doy = getDOY(MJD, forceJulian); - sprintf(DateTime, "%03d", doy); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'k') - { - /* hour, 24 hour clock ( 0 - 23) */ - if(hour < 10) - sprintf(DateTime, " %01d", hour); - else - sprintf(DateTime, "%02d", hour); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'l') - { - /* hour, 12 hour clock ( 1 - 12) */ - if(hour == 0) sprintf(DateTime, "%02d", hour+12); - else if(hour < 10) sprintf(DateTime, " %01d", hour); - else if(hour <= 12) sprintf(DateTime, "%02d", hour); - else if(hour < 22) sprintf(DateTime, " %01d", hour-12); - else sprintf(DateTime, "%02d", hour-12); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'm') - { - /* month (01 - 12) */ - sprintf(DateTime, "%02d", month); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'M') - { - /* minute (00 - 59) */ - sprintf(DateTime, "%02d", min); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'n') - { - /* newline */ - buf[posn] = '\n'; - posn++; - if(posn >= last) return posn; - } - else if(next == 'p') - { - /* am/pm on12 hour clock */ - if(hour < 0) sprintf(DateTime, "AM"); - else sprintf(DateTime, "PM"); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'r') - { - /* hour:min:sec AM, 12 hour clock (01 - 12):(00 - 59):(00 - 59) (AM - PM) */ - if(hour == 0) sprintf(DateTime, "%02d:%02d:%02d AM", hour+12, min, second); - else if(hour > 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour-12, min, second); - else if(hour == 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour, min, second); - else sprintf(DateTime, "%02d:%02d:%02d AM", hour, min, second); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'R') - { - /* hour:min, 24 hour clock (00 - 23):(00 - 59) */ - sprintf(DateTime, "%02d:%02d", hour, min); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'S') - { - /* second (00 - 59) */ - sprintf(DateTime, "%02d", second); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 's') - { - /* seconds since 01 Jan 1970 Gregorian */ - int s = MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay; - sprintf(DateTime, "%d", s); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 't') - { - /* tab */ - buf[posn] = '\t'; - posn++; - if(posn >= last) return posn; - } - else if(next == 'T') - { - /* hour:min:sec, 24 hour clock (00 - 23):(00 - 59):(00 - 59) */ - sprintf(DateTime, "%02d:%02d:%02d", hour, min, second); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'U') - { - /* week of year as a number, (00 - 53) start of week is Sunday */ - int w; - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 4) % 7; - - w = (doy + 6 - days_in_wk1) / 7; - - sprintf(DateTime, "%02d", w); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'u') - { - /* weekday as a number, 0 = Monday */ - int d = 1 + (MJD->base_day - 5) % 7; - - sprintf(DateTime, "%01d", d); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'v') - { - /* day-MonthName-year day of month ( 1 - 31) - month (Jan ... Dec) - year (yyyy) */ - - monthText = getMonth(month); - - if(ysign == 0) - { - if(day < 10) - sprintf(DateTime, " %01d-%s-%04d", day, monthText, year); - else - sprintf(DateTime, "%02d-%s-%04d", day, monthText, year); - } - else - { - if(day < 10) - sprintf(DateTime, " %01d-%s-(-)%04d", day, monthText, year); - else - sprintf(DateTime, "%02d-%s-(-)%04d", day, monthText, year); - } - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'V') - { - /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ - int w; - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; - - if(days_in_wk1 <= 3) w = (doy +6 - days_in_wk1) / 7; /* ensure first week has at least 3 days in this year */ - else w = 1 + (doy + 6 - days_in_wk1) / 7; - - if(w == 0) w = 53; - sprintf(DateTime, "%02d", w); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'w') - { - /* weekday as a number, 0 = Sunday */ - int d = (MJD->base_day - 4) % 7; - - sprintf(DateTime, "%01d", d); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'W') - { - /* week of year as a number, (00 - 53) start of week is Monday */ - int w; - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; - - w = (doy +6 - days_in_wk1) / 7; - - sprintf(DateTime, "%02d", w); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'x') - { - /* date string */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d, %04d", dayText, monthText, day, year ); - else - sprintf(DateTime, "%s %s %02d, -%04d", dayText, monthText, day, year ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'X') - { - /* time string */ - sprintf(DateTime, "%02d:%02d:%02d", hour, min, second ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'y') - { - /* 2 digit year */ - int y = year %100; - - if(ysign == 0) - sprintf(DateTime, "%02d", y ); - else - sprintf(DateTime, "-%02d", y ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'Y') - { - /* 4 digit year */ - if(ysign == 0) - sprintf(DateTime, "%04d", year ); - else - sprintf(DateTime, "-%04d", year ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'Z') - { - /* time zone and calendar, alwaus UTC */ - if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian == 1) - strncat(&(buf[posn]), "UTC Julian", last - posn); - else - strncat(&(buf[posn]), "UTC Gregorian", last - posn); - - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'z') - { - /* time zone, always UTC */ - strncat(&(buf[posn]), "+0000", last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == '+') - { - /* date and time */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC %04d", dayText, monthText, day, hour, min, second, year ); - else - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC -%04d", dayText, monthText, day, hour, min, second, year ); - - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if( isdigit(next) != 0 ) - { - nplaces = strtol(&(format[i]), NULL, 10); - /* numeric value is number of decimal places ( > 0 ) */ - double sec_fraction = sec - (double) second; - - for(count=0; count<nplaces; count++) sec_fraction *= 10; - sprintf(DateTime, ".%d", (int) sec_fraction); - - /* append 0 to pad to length */ - slen = strlen(DateTime); - while(slen < nplaces+1) - { - DateTime[slen] = '0'; - slen++; - DateTime[slen] = '\0'; - } - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if( next == '.' ) - { - /* fractional part of seconds to maximum available accuracy */ - double sec_fraction = sec - (double) second; - sprintf(DateTime, "%-11.9f", sec_fraction); - while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; /* remove trailing white space */ - slen = strlen(DateTime) -1; - while( DateTime[slen] == '0' && DateTime[slen-1] != '.') { - DateTime[slen] ='\0'; /* remove trailing zeros */ - slen --; - } - - ptr = strchr(DateTime, '.'); /* remove possible lead 0 */ - strncat(&(buf[posn]), ptr, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - } - else - { - /* regular multi-byte character, pass it on */ - buf[posn] = next; - posn++; - if(posn >= last) return posn; - } - buf[posn] = '\0'; - i++; - } - return posn; -} Deleted: trunk/lib/qsastime/MJDtime.h =================================================================== --- trunk/lib/qsastime/MJDtime.h 2009-02-04 23:11:59 UTC (rev 9451) +++ trunk/lib/qsastime/MJDtime.h 2009-02-05 00:34:15 UTC (rev 9452) @@ -1,80 +0,0 @@ -/* - This software originally contributed under the LGPL in January 2009 to - PLplot by the - Cluster Science Centre - QSAS team, - Imperial College, London - Copyright (C) 2009 Imperial College, London - - This file is part of PLplot. - - PLplot is free software; you can redistribute it and/or modify - it under the terms of the GNU General Library Public License as published - by the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - PLplot is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with PLplot; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - - /* MJD measures from the start of 17 Nov 1858 */ - - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian - Note C libraries use Gregorian only from 14 Sept 1752 - More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php - These routines have been compared with the results of the US Naval Observatory online converter. - Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - - In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - - */ - - #include <stdio.h> - #include <stdlib.h> - #include <string.h> -/* include header file for dll definitions */ - #include "qsastimedll.h" - - -typedef struct MJDtimeStruct -{ - /* - MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). - The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. - */ - - int base_day; /* integer part of MJD used as default */ - double time_sec; /* seconds from start of base_day */ - -}MJDtime; - - -QSASTIMEDLLIMPEXP void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromCDFepoch(double cdfepoch, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromJD(double JulianDate, MJDtime *MJD); -QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD); -QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP double getMJD(MJDtime *MJD); -QSASTIMEDLLIMPEXP double getJD(MJDtime *MJD); -QSASTIMEDLLIMPEXP double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); -QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); -QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); -QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getMonth(int m); -QSASTIMEDLLIMPEXP const char * getLongMonth(int m); -QSASTIMEDLLIMPEXP int getDOY(const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); Deleted: trunk/lib/qsastime/MJDtime.html =================================================================== --- trunk/lib/qsastime/MJDtime.html 2009-02-04 23:11:59 UTC (rev 9451) +++ trunk/lib/qsastime/MJDtime.html 2009-02-05 00:34:15 UTC (rev 9452) @@ -1,1560 +0,0 @@ -<html xmlns:o="urn:schemas-microsoft-com:office:office" -xmlns:w="urn:schemas-microsoft-com:office:word" -xmlns="http://www.w3.org/TR/REC-html40"> - -<head> -<meta name=Title content=SYNOPSIS> -<meta name=Keywords content=""> -<meta http-equiv=Content-Type content="text/html; charset=macintosh"> -<meta name=ProgId content=Word.Document> -<meta name=Generator content="Microsoft Word 10"> -<meta name=Originator content="Microsoft Word 10"> -<link rel=File-List href="MJDtime_files/filelist.xml"> -<title>SYNOPSIS</title> -<!--[if gte mso 9]><xml> - <o:DocumentProperties> - <o:Author>Anthony Allen</o:Author> - <o:Template>Normal</o:Template> - <o:LastAuthor>Anthony Allen</o:LastAuthor> - <o:Revision>2</o:Revision> - <o:Created>2009-01-29T17:22:00Z</o:Created> - <o:LastSaved>2009-01-29T17:22:00Z</o:LastSaved> - <o:Pages>9</o:Pages> - <o:Words>2365</o:Words> - <o:Characters>13485</o:Characters> - <o:Company>Imperial College</o:Company> - <o:Lines>112</o:Lines> - <o:Paragraphs>26</o:Paragraphs> - <o:CharactersWithSpaces>16560</o:CharactersWithSpaces> - <o:Version>10.260</o:Version> - </o:DocumentProperties> -</xml><![endif]--><!--[if gte mso 9]><xml> - <w:WordDocument> - <w:Zoom>150</w:Zoom> - <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> - <w:DisplayVerticalDrawingGridEvery>0</w:DisplayVerticalDrawingGridEvery> - <w:UseMarginsForDrawingGridOrigin/> - </w:WordDocument> -</xml><![endif]--> -<style> -<!-- - /* Font Definitions */ -@font-face - {font-family:"Times New Roman"; - panose-1:0 2 2 6 3 5 4 5 2 3; - mso-font-charset:0; - mso-generic-font-family:auto; - mso-font-pitch:variable; - mso-font-signature:50331648 0 0 0 1 0;} -@font-face - {font-family:Monaco; - panose-1:0 2 0 5 0 0 0 0 0 0; - mso-font-charset:0; - mso-generic-font-family:auto; - mso-font-pitch:variable; - mso-font-signature:50331648 0 0 0 1 0;} - /* Style Definitions */ -p.MsoNormal, li.MsoNormal, div.MsoNormal - {mso-style-parent:""; - margin:0cm; - margin-bottom:.0001pt; - mso-pagination:widow-orphan; - font-size:12.0pt; - font-family:"Times New Roman"; - mso-ansi-language:EN-GB;} -@page Section1 - {size:595.0pt 842.0pt; - margin:72.0pt 70.9pt 2.0cm 70.9pt; - mso-header-margin:35.45pt; - mso-footer-margin:35.45pt; - mso-paper-source:0;} -div.Section1 - {page:Section1;} ---> -</style> -</head> - -<body bgcolor=white lang=EN-GB style='tab-interval:36.0pt'> - -<div class=Section1> - -<p class=MsoNormal align=center style='text-align:center'><span -style='font-size:14.0pt'><b>MJDtime Routines<o:p></o:p></b></span></p> - -<p class=MsoNormal align=center style='text-align:center'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p> - -<p class=MsoNormal align=center style='text-align:center'>QSAS Support Team</p> - -<p class=MsoNormal align=center style='text-align:center'>Cluster Science -Centre, Imperial College</p> - -<p class=MsoNormal align=center style='text-align:center'>csc...@im...</p> - -<p class=MsoNormal align=center style='text-align:center'>Provided under -the library gnu public licence (LGPL).</p> - -<p class=MsoNormal align=center style='text-align:center'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>These routines convert between various date and -time formats. The date and time is stored internally as a structure , MJDtime, -containing an integer, as the integer part of the MJD date, and a double -representing the seconds offset from the start of this day. Routines exist to -also set and get MJD, JD, formatted date/time strings and NASA CDF epoch -date/times from this structure.<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>Modified Julian Date (MJD) measures days (and -fractional days) since the start of 17 Nov 1858 CE in Universal Time (UTC). -Julian Date (JD) measures days (and fractional days) since noon on 1 January, -4713 BCE in Universal Time (UTC).<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>Modified Julian Date (MJD) = Julian Date (JD) - -2400000.5<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>Common Era (CE) and Before Common Era (BCE) are -also often called AD and BC respectively.<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>These utilities use the Gregorian calendar -after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 (Gregorian). In some routines -the forceJulian flag can be set to 1 to override this and explicitly use the -Julian calendar in conversions. The default value for forceJulian is 0 (do not -force use of Julian Calendar). Note C libraries use Gregorian only from 14 Sept -1752 and will yield different results between years 1582 and 1752.<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style="mso-spacerun: -yes"> </span>More detailed discussion can be found at </span><span -lang=EN-US style='font-family:Monaco;mso-ansi-language:EN-US'><a -href="http://aa.usno.navy.mil/data/docs/JulianDate.php"><span style='font-family: -"Times New Roman";color:windowtext'>http://aa.usno.navy.mil/data/docs/JulianDate.php</span></a></span><span -lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>These routines have been compared with the results -of the US Naval Observatory online converter.<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span><span -style="mso-spacerun: yes"> </span><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style="mso-spacerun: yes"> </span>In -all routines, specifying a day, hour, minute or second field greater than would -be valid is<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style="mso-spacerun: -yes"> </span>handled with modulo arithmetic and is safe. <o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>Thus 2006-12-32 00:62:00.0 will be safely, and -correctly, treated as 2007-01-01 01:02:00.0 <o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span><span -style="mso-spacerun: yes"> </span><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>MJD starts at 0h, so truncating MJD always -gives the same day whatever the time of day (unlike JD). The seconds offset may -take any value, so that any date/time may be expressed in terms of an offset -from the same MJD day. The seconds field thus may exceed a single day, and may -also be negative.<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><![if !supportEmptyParas]> <![endif]><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>typedef struct MJDtimeStruct<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>{ <o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span>int -base_day; /* integer part of MJD<span style="mso-spacerun: yes"> -</span>*/<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span>double -time_sec; /* seconds from start of base_day */<o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'><span style='mso-tab-count:1'> </span><o:p></o:p></span></p> - -<p class=MsoNormal style='mso-pagination:none;tab-stops:24.0pt 48.0pt 72.0pt 96.0pt 120.0pt 144.0pt 168.0pt 192.0pt 216.0pt 240.0pt 264.0pt 288.0pt 312.0pt 336.0pt 360.0pt 384.0pt 408.0pt 432.0pt 456.0pt 480.0pt 504.0pt 528.0pt 552.0pt 576.0pt 600.0pt 624.0pt 648.0pt 672.0pt 696.0pt 720.0pt 744.0pt 768.0pt 792.0pt 816.0pt 840.0pt 864.0pt 888.0pt 912.0pt 936.0pt 960.0pt 984.0pt 1008.0pt 1032.0pt 1056.0pt 1080.0pt 1104.0pt 1128.0pt 1152.0pt 1176.0pt 1200.0pt 1224.0pt 1248.0pt 1272.0pt 1296.0pt 1320.0pt 1344.0pt 1368.0pt 1392.0pt 1416.0pt 1440.0pt 1464.0pt 1488.0pt 1512.0pt 1536.0pt; -mso-layout-grid-align:none;text-autospace:none'><span lang=EN-US -style='mso-ansi-language:EN-US'>}MJDtime;<o:p></o:p>... [truncated message content] |
From: <ai...@us...> - 2009-02-05 00:52:54
|
Revision: 9453 http://plplot.svn.sourceforge.net/plplot/?rev=9453&view=rev Author: airwin Date: 2009-02-05 00:52:50 +0000 (Thu, 05 Feb 2009) Log Message: ----------- Do required internal changes for MJDtime to qsastime file name conversion. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime_test.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-05 00:34:15 UTC (rev 9452) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-05 00:52:50 UTC (rev 9453) @@ -24,8 +24,8 @@ ) set(qsastime_LIB_SRCS -MJDtime.c -MJDtime.h +qsastime.c +qsastime.h ) if(BUILD_SHARED_LIBS) @@ -49,5 +49,5 @@ RUNTIME DESTINATION ${BIN_DIR} ) -add_executable(test_qsastime MJDtime_test.c) +add_executable(test_qsastime qsastime_test.c) target_link_libraries(test_qsastime qsastime) Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 00:34:15 UTC (rev 9452) +++ trunk/lib/qsastime/qsastime.c 2009-02-05 00:52:50 UTC (rev 9453) @@ -38,7 +38,7 @@ */ -#include <MJDtime.h> +#include <qsastime.h> double MJDtoJD = 2400000.5; double SecInDay = 86400; /* we ignore leap seconds */ Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-05 00:34:15 UTC (rev 9452) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-05 00:52:50 UTC (rev 9453) @@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - #include <MJDtime.h> + #include <qsastime.h> #include <time.h> #include <stdio.h> #include <stdlib.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-05 03:09:21
|
Revision: 9455 http://plplot.svn.sourceforge.net/plplot/?rev=9455&view=rev Author: airwin Date: 2009-02-05 03:09:11 +0000 (Thu, 05 Feb 2009) Log Message: ----------- Split code up so that only essential code (qsastime.c) appears in the library while non-essential code (qsastime_extra.c) is only currently used by qsastime_test.c. The refactored code builds and executes (both plplot example 29 and lib/qsastime/qsastime_test in the build tree) without issues. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_test.c Added Paths: ----------- trunk/lib/qsastime/qsastime_extra.c trunk/lib/qsastime/qsastime_extra.h Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-05 00:55:25 UTC (rev 9454) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-05 03:09:11 UTC (rev 9455) @@ -26,6 +26,7 @@ set(qsastime_LIB_SRCS qsastime.c qsastime.h +qsastimedll.h ) if(BUILD_SHARED_LIBS) @@ -49,5 +50,7 @@ RUNTIME DESTINATION ${BIN_DIR} ) -add_executable(test_qsastime qsastime_test.c) -target_link_libraries(test_qsastime qsastime) +# qsastime_extra.[ch] provides helper functions for qsastime_test that should +# not be part of the library. +add_executable(qsastime_test qsastime_test.c qsastime_extra.c qsastime_extra.h) +target_link_libraries(qsastime_test qsastime) Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 00:55:25 UTC (rev 9454) +++ trunk/lib/qsastime/qsastime.c 2009-02-05 03:09:11 UTC (rev 9455) @@ -38,9 +38,8 @@ */ -#include <qsastime.h> +#include "qsastime.h" -double MJDtoJD = 2400000.5; double SecInDay = 86400; /* we ignore leap seconds */ int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; @@ -106,150 +105,6 @@ return; } - -int setFromISOstring(const char* ISOstring, MJDtime *MJD) -{ - double seconds; - int y, m, d, h, min; - char* ptr; - int startAt=0; - int len = strlen(ISOstring); - - /* ISO is "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z" */ - - /* parse off year */ - - y = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 5; - if(startAt > len) return 1; - - m = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - d = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - h = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - min = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; - - seconds = strtod(&(ISOstring[startAt]), NULL); - setFromUT(y, m, d, h, min, seconds, MJD, 0); - - return 0; -} - - -void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian) -{ - /* Set from Day Of Year format */ - - /* convert Gregorian date plus time to MJD */ - /* MJD measures from the start of 17 Nov 1858 */ - - /* the int flag forceJulian forces use of Julian calendar whatever the year */ - /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ - /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ - - if(year <= 0) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - - int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ - MJD->base_day = year * 365 + leaps + doy - 678943; - - } - else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - - int leaps = (year -1 ) / 4; - MJD->base_day = year * 365 + leaps + doy - 678943; - - } - else - { - /* count leap years Gregorian Calendar - modern dates */ - /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ - /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - - int lastyear = year - 1; - int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; - MJD->base_day = year * 365 + leaps + doy - 678941; - - } - - MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; - - if(MJD->time_sec >= SecInDay) - { - int extraDays = (int) (MJD->time_sec / SecInDay); - MJD->base_day += extraDays; - MJD->time_sec -= extraDays * SecInDay; - } - - return; - -} - - -void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD) -{ - /* utility to allow user to input dates BCE (BC) */ - - int year = 1 - yearBCE; - setFromUT(year, month, day, hour, min, sec, MJD, 0); - -} - -void setFromMJD(double ModifiedJulianDate, MJDtime *MJD) -{ - /* convert MJD double into MJD structure */ - MJD->base_day = (int) ModifiedJulianDate; - MJD->time_sec = (ModifiedJulianDate - MJD->base_day) * SecInDay; -} - -void setFromJD(double JulianDate, MJDtime *MJD) -{ - /* break JD double into MJD based structure - Note Julian Day starts Noon, so convert to MJD first */ - - MJD->base_day = (int) (JulianDate - MJDtoJD) ; - MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; -} - -void setFromCDFepoch(double cdfepoch, MJDtime *MJD){ - - /* convert cdf epoch double into MJD structure - Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ - - double seconds = cdfepoch * 0.001; - - MJD->base_day = (int) (seconds / 86400.0); - MJD->time_sec = seconds - MJD->base_day * SecInDay; - MJD->base_day -= 678941; - -} - -double getCDFepoch(MJDtime *MJD){ - - /* convert MJD structure into cdf epoch double - Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ - - int days = MJD->base_day + 678941; - double seconds = days * SecInDay + MJD->time_sec; - return seconds * 1000.; -} - const char * getDayOfWeek( const MJDtime *MJD) { static char *dow = {"Wed\0Thu\0Fri\0Sat\0Sun\0Mon\0Tue"}; @@ -340,7 +195,6 @@ return doy; } - void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian) { /* Convert MJD struct into date/time elements */ @@ -475,89 +329,6 @@ *sec = seconds - (double) *min * 60.; } -double getMJD(MJDtime *MJD) -{ - /* Return MJD as a double */ - return (double) MJD->base_day + MJD->time_sec / SecInDay ; -} - -double getJD(MJDtime *MJD) -{ - /* Return JD as a double */ - double JD = getMJD(MJD) + MJDtoJD; - return JD; -} - -double getDiffDays(MJDtime *MJD1, MJDtime *MJD2) -{ - /* Return difference MJD1 - MJD2 in days as a double */ - double diff = (double)(MJD1->base_day - MJD1->base_day) + (MJD1->time_sec - MJD1->time_sec) / SecInDay; - return diff; -} - -double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2) -{ - /* Return difference MJD1 - MJD2 in seconds as a double */ - double diff = (double)(MJD1->base_day - MJD1->base_day) * SecInDay + (MJD1->time_sec - MJD1->time_sec) ; - return diff; -} - -const char * getISOString(MJDtime* MJD, int delim) -{ - /* ISO time string for UTC */ - /* uses default behaviour for Julian/Gregorian switch over */ - static char DateTime[50]; - int y, m, d, hour, min; - int sec1, ysign; - double sec; - int slen; - - breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, 0); - - if(y < 0) - { - ysign = 1; - y=-y; - } - else ysign = 0; - - sec1 = (int)sec/10; - sec -= (double) sec1*10; - - if(delim == 1) - { - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - else - sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - - /* remove trailing white space */ - char * ptr; - while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; - strcat(&(DateTime[0]), "Z"); - } - else - { - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - else - sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); - - /* remove trailing white space */ - char * ptr; - slen = strlen(DateTime)-1; - while( DateTime[slen] == ' ') - { - DateTime[slen] ='\0'; - slen--; - } - - } - return &(DateTime[0]); -} - - - size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian) { /* Format a text string according to the format string. Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-05 00:55:25 UTC (rev 9454) +++ trunk/lib/qsastime/qsastime.h 2009-02-05 03:09:11 UTC (rev 9455) @@ -59,22 +59,13 @@ QSASTIMEDLLIMPEXP void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromCDFepoch(double cdfepoch, MJDtime *MJD); -QSASTIMEDLLIMPEXP void setFromJD(double JulianDate, MJDtime *MJD); -QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD); QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP double getMJD(MJDtime *MJD); -QSASTIMEDLLIMPEXP double getJD(MJDtime *MJD); -QSASTIMEDLLIMPEXP double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); -QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); -QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); +QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); + +/* The following are externally accessible for now only because + the test routine calls them directly */ QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); QSASTIMEDLLIMPEXP const char * getMonth(int m); QSASTIMEDLLIMPEXP const char * getLongMonth(int m); QSASTIMEDLLIMPEXP int getDOY(const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); Copied: trunk/lib/qsastime/qsastime_extra.c (from rev 9453, trunk/lib/qsastime/qsastime.c) =================================================================== --- trunk/lib/qsastime/qsastime_extra.c (rev 0) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-05 03:09:11 UTC (rev 9455) @@ -0,0 +1,269 @@ +/* + This software originally contributed under the LGPL in January 2009 to + PLplot by the + Cluster Science Centre + QSAS team, + Imperial College, London + Copyright (C) 2009 Imperial College, London + + This file is part of PLplot. + + PLplot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Library Public License as published + by the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + PLplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with PLplot; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + /* MJD measures from the start of 17 Nov 1858 */ + + /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam + Note C libraries use Gregorian only from 14 Sept 1752 + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php + These routines have been compared with the results of the US Naval Observatory online converter. + Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 + + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + + */ + +#include "qsastime_extra.h" + +double MJDtoJD = 2400000.5; +double SecInDay = 86400; /* we ignore leap seconds */ + +int setFromISOstring(const char* ISOstring, MJDtime *MJD) +{ + double seconds; + int y, m, d, h, min; + char* ptr; + int startAt=0; + int len = strlen(ISOstring); + + /* ISO is "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z" */ + + /* parse off year */ + + y = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 5; + if(startAt > len) return 1; + + m = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; + + d = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; + + h = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; + + min = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; + + seconds = strtod(&(ISOstring[startAt]), NULL); + setFromUT(y, m, d, h, min, seconds, MJD, 0); + + return 0; +} + + +void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian) +{ + /* Set from Day Of Year format */ + + /* convert Gregorian date plus time to MJD */ + /* MJD measures from the start of 17 Nov 1858 */ + + /* the int flag forceJulian forces use of Julian calendar whatever the year */ + /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ + /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ + + if(year <= 0) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ + + int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + MJD->base_day = year * 365 + leaps + doy - 678943; + + } + else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + + int leaps = (year -1 ) / 4; + MJD->base_day = year * 365 + leaps + doy - 678943; + + } + else + { + /* count leap years Gregorian Calendar - modern dates */ + /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ + /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ + + int lastyear = year - 1; + int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; + MJD->base_day = year * 365 + leaps + doy - 678941; + + } + + MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; + + if(MJD->time_sec >= SecInDay) + { + int extraDays = (int) (MJD->time_sec / SecInDay); + MJD->base_day += extraDays; + MJD->time_sec -= extraDays * SecInDay; + } + + return; + +} + + +void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD) +{ + /* utility to allow user to input dates BCE (BC) */ + + int year = 1 - yearBCE; + setFromUT(year, month, day, hour, min, sec, MJD, 0); + +} + +void setFromMJD(double ModifiedJulianDate, MJDtime *MJD) +{ + /* convert MJD double into MJD structure */ + MJD->base_day = (int) ModifiedJulianDate; + MJD->time_sec = (ModifiedJulianDate - MJD->base_day) * SecInDay; +} + +void setFromJD(double JulianDate, MJDtime *MJD) +{ + /* break JD double into MJD based structure + Note Julian Day starts Noon, so convert to MJD first */ + + MJD->base_day = (int) (JulianDate - MJDtoJD) ; + MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; +} + +void setFromCDFepoch(double cdfepoch, MJDtime *MJD){ + + /* convert cdf epoch double into MJD structure + Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ + + double seconds = cdfepoch * 0.001; + + MJD->base_day = (int) (seconds / 86400.0); + MJD->time_sec = seconds - MJD->base_day * SecInDay; + MJD->base_day -= 678941; + +} + +double getCDFepoch(MJDtime *MJD){ + + /* convert MJD structure into cdf epoch double + Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ + + int days = MJD->base_day + 678941; + double seconds = days * SecInDay + MJD->time_sec; + return seconds * 1000.; +} + +double getMJD(MJDtime *MJD) +{ + /* Return MJD as a double */ + return (double) MJD->base_day + MJD->time_sec / SecInDay ; +} + +double getJD(MJDtime *MJD) +{ + /* Return JD as a double */ + double JD = getMJD(MJD) + MJDtoJD; + return JD; +} + +double getDiffDays(MJDtime *MJD1, MJDtime *MJD2) +{ + /* Return difference MJD1 - MJD2 in days as a double */ + double diff = (double)(MJD1->base_day - MJD1->base_day) + (MJD1->time_sec - MJD1->time_sec) / SecInDay; + return diff; +} + +double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2) +{ + /* Return difference MJD1 - MJD2 in seconds as a double */ + double diff = (double)(MJD1->base_day - MJD1->base_day) * SecInDay + (MJD1->time_sec - MJD1->time_sec) ; + return diff; +} + +const char * getISOString(MJDtime* MJD, int delim) +{ + /* ISO time string for UTC */ + /* uses default behaviour for Julian/Gregorian switch over */ + static char DateTime[50]; + int y, m, d, hour, min; + int sec1, ysign; + double sec; + int slen; + + breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, 0); + + if(y < 0) + { + ysign = 1; + y=-y; + } + else ysign = 0; + + sec1 = (int)sec/10; + sec -= (double) sec1*10; + + if(delim == 1) + { + if(ysign == 0) + sprintf(DateTime, "%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); + else + sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); + + /* remove trailing white space */ + char * ptr; + while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; + strcat(&(DateTime[0]), "Z"); + } + else + { + if(ysign == 0) + sprintf(DateTime, "%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); + else + sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); + + /* remove trailing white space */ + char * ptr; + slen = strlen(DateTime)-1; + while( DateTime[slen] == ' ') + { + DateTime[slen] ='\0'; + slen--; + } + + } + return &(DateTime[0]); +} + Copied: trunk/lib/qsastime/qsastime_extra.h (from rev 9452, trunk/lib/qsastime/qsastime.h) =================================================================== --- trunk/lib/qsastime/qsastime_extra.h (rev 0) +++ trunk/lib/qsastime/qsastime_extra.h 2009-02-05 03:09:11 UTC (rev 9455) @@ -0,0 +1,58 @@ +/* + This software originally contributed under the LGPL in January 2009 to + PLplot by the + Cluster Science Centre + QSAS team, + Imperial College, London + Copyright (C) 2009 Imperial College, London + + This file is part of PLplot. + + PLplot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Library Public License as published + by the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + PLplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with PLplot; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + + /* MJD measures from the start of 17 Nov 1858 */ + + /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian + Note C libraries use Gregorian only from 14 Sept 1752 + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php + These routines have been compared with the results of the US Naval Observatory online converter. + Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 + + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + + */ + + #include <stdio.h> + #include <stdlib.h> + #include <string.h> +/* include header file for dll definitions */ + #include "qsastime.h" + +QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromCDFepoch(double cdfepoch, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromJD(double JulianDate, MJDtime *MJD); +QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD); +QSASTIMEDLLIMPEXP double getMJD(MJDtime *MJD); +QSASTIMEDLLIMPEXP double getJD(MJDtime *MJD); +QSASTIMEDLLIMPEXP double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); +QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); +QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-05 00:55:25 UTC (rev 9454) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-05 03:09:11 UTC (rev 9455) @@ -23,13 +23,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - #include <qsastime.h> + #include "qsastime_extra.h" #include <time.h> #include <stdio.h> #include <stdlib.h> /* Test program to run MJDtime */ - int main() { char buf[360]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-02-05 20:23:12
|
Revision: 9458 http://plplot.svn.sourceforge.net/plplot/?rev=9458&view=rev Author: andrewross Date: 2009-02-05 20:23:08 +0000 (Thu, 05 Feb 2009) Log Message: ----------- Apply patch from Terrence Keats(?) to fix compilation of qsastime library on MSVC. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_extra.c trunk/lib/qsastime/qsastime_extra.h trunk/lib/qsastime/qsastime_test.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-05 20:23:08 UTC (rev 9458) @@ -25,8 +25,6 @@ set(qsastime_LIB_SRCS qsastime.c -qsastime.h -qsastimedll.h ) if(BUILD_SHARED_LIBS) @@ -44,6 +42,14 @@ INSTALL_NAME_DIR "${LIB_DIR}" ) + +set(qsastime_INSTALLED_HEADERS + qsastime.h + qsastimedll.h +) + +install(FILES ${qsastime_INSTALLED_HEADERS} DESTINATION ${INCLUDE_DIR}) + install(TARGETS qsastime ARCHIVE DESTINATION ${LIB_DIR} LIBRARY DESTINATION ${LIB_DIR} Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/qsastime.c 2009-02-05 20:23:08 UTC (rev 9458) @@ -37,7 +37,7 @@ Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 */ - +#include <ctype.h> #include "qsastime.h" double SecInDay = 86400; /* we ignore leap seconds */ @@ -54,13 +54,15 @@ /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ /* Note C libraries use Gregorian only from 14 Sept 1752 onwards */ + int leaps, lastyear; + if(year <= 0) { /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ if(year%4 == 0) MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678943; else @@ -72,7 +74,7 @@ /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - int leaps = (year -1 ) / 4; + leaps = (year -1 ) / 4; if(year%4 == 0) MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678943; else @@ -84,8 +86,8 @@ /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - int lastyear = year - 1; - int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; + lastyear = year - 1; + leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) MJD->base_day = year * 365 + leaps + MonthStartDOY_L[month-1] + day - 678941; else @@ -137,7 +139,7 @@ /* Get from Day Of Year */ int doy, year; - int extra_days; + int extra_days,j,lastyear; if(MJD->time_sec >= 0) { @@ -150,7 +152,7 @@ } - int j = MJD->base_day + extra_days; + j = MJD->base_day + extra_days; if( j <= -678943) { @@ -187,7 +189,7 @@ j += 678941; year = (int) ((float)j / 365.2425); - int lastyear = year - 1; + lastyear = year - 1; doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; } @@ -201,7 +203,8 @@ /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ /* There are 678943 days from year 0 to MJD(0) */ - int extra_days; + int extra_days,j,lastyear; + double seconds; if(MJD->time_sec >= 0) { @@ -214,7 +217,7 @@ } - int j = MJD->base_day + extra_days; + j = MJD->base_day + extra_days; if( j <= -678943) { @@ -295,7 +298,7 @@ j += 678941; *year = (int) ((float)j / 365.2425); - int lastyear = *year - 1; + lastyear = *year - 1; j = j - *year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; *month = 0; @@ -322,7 +325,7 @@ /* Time part */ - double seconds = MJD->time_sec - extra_days * SecInDay; + seconds = MJD->time_sec - extra_days * SecInDay; *hour = (int)( seconds / 3600.); seconds -= (double) *hour * 3600.; *min = (int) ( seconds / 60.); @@ -335,11 +338,12 @@ Uses the same syntax as strftime() but does not use current locale. The null terminator is included in len for safety. */ - int year, month, day, hour, min, ysign, sec1, sec_fract, second; - int i, count; - int nplaces, slen; + int year, month, day, hour, min, ysign, sec1, second,d,y; + int i, count,secsSince1970; + int nplaces,fmtlen,slen; char * ptr; - double sec; + double sec,sec_fraction; + int w,doy,days_in_wk1; const char *dayText; const char *monthText; char DateTime[80]; @@ -361,8 +365,9 @@ sec -= (double) sec1*10; /* Read format string, character at a time */ + fmtlen = strlen(format); i=0; - while(i<strlen(format)) + while(i<fmtlen) { char next = format[i]; if( next == '%') @@ -605,8 +610,8 @@ else if(next == 's') { /* seconds since 01 Jan 1970 Gregorian */ - int s = MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay; - sprintf(DateTime, "%d", s); + secsSince1970 = (int)(MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay); + sprintf(DateTime, "%d", secsSince1970); strncat(&(buf[posn]), DateTime, last - posn); posn = strlen(buf); @@ -631,9 +636,8 @@ else if(next == 'U') { /* week of year as a number, (00 - 53) start of week is Sunday */ - int w; - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 4) % 7; + doy = getDOY(MJD, forceJulian); + days_in_wk1 = (MJD->base_day - doy - 4) % 7; w = (doy + 6 - days_in_wk1) / 7; @@ -646,7 +650,7 @@ else if(next == 'u') { /* weekday as a number, 0 = Monday */ - int d = 1 + (MJD->base_day - 5) % 7; + d = 1 + (MJD->base_day - 5) % 7; sprintf(DateTime, "%01d", d); @@ -682,7 +686,6 @@ else if(next == 'V') { /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ - int w; int doy = getDOY(MJD, forceJulian); int days_in_wk1 = (MJD->base_day - doy - 3) % 7; @@ -699,7 +702,7 @@ else if(next == 'w') { /* weekday as a number, 0 = Sunday */ - int d = (MJD->base_day - 4) % 7; + d = (MJD->base_day - 4) % 7; sprintf(DateTime, "%01d", d); @@ -710,9 +713,8 @@ else if(next == 'W') { /* week of year as a number, (00 - 53) start of week is Monday */ - int w; - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; + doy = getDOY(MJD, forceJulian); + days_in_wk1 = (MJD->base_day - doy - 3) % 7; w = (doy +6 - days_in_wk1) / 7; @@ -748,7 +750,7 @@ else if(next == 'y') { /* 2 digit year */ - int y = year %100; + y = year %100; if(ysign == 0) sprintf(DateTime, "%02d", y ); @@ -807,7 +809,7 @@ { nplaces = strtol(&(format[i]), NULL, 10); /* numeric value is number of decimal places ( > 0 ) */ - double sec_fraction = sec - (double) second; + sec_fraction = sec - (double) second; for(count=0; count<nplaces; count++) sec_fraction *= 10; sprintf(DateTime, ".%d", (int) sec_fraction); @@ -827,7 +829,7 @@ else if( next == '.' ) { /* fractional part of seconds to maximum available accuracy */ - double sec_fraction = sec - (double) second; + sec_fraction = sec - (double) second; sprintf(DateTime, "%-11.9f", sec_fraction); while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; /* remove trailing white space */ slen = strlen(DateTime) -1; Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/qsastime.h 2009-02-05 20:23:08 UTC (rev 9458) @@ -1,3 +1,5 @@ +#ifndef _QSASTIME_H_ +#define _QSASTIME_H_ /* This software originally contributed under the LGPL in January 2009 to PLplot by the @@ -69,3 +71,5 @@ QSASTIMEDLLIMPEXP const char * getMonth(int m); QSASTIMEDLLIMPEXP const char * getLongMonth(int m); QSASTIMEDLLIMPEXP int getDOY(const MJDtime *MJD, int forceJulian); + +#endif Modified: trunk/lib/qsastime/qsastime_extra.c =================================================================== --- trunk/lib/qsastime/qsastime_extra.c 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-05 20:23:08 UTC (rev 9458) @@ -47,7 +47,6 @@ { double seconds; int y, m, d, h, min; - char* ptr; int startAt=0; int len = strlen(ISOstring); @@ -93,13 +92,15 @@ /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ + int leaps, lastyear,extraDays; + if(year <= 0) { /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - int leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ MJD->base_day = year * 365 + leaps + doy - 678943; } @@ -108,7 +109,7 @@ /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - int leaps = (year -1 ) / 4; + leaps = (year -1 ) / 4; MJD->base_day = year * 365 + leaps + doy - 678943; } @@ -118,8 +119,8 @@ /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - int lastyear = year - 1; - int leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; + lastyear = year - 1; + leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; MJD->base_day = year * 365 + leaps + doy - 678941; } @@ -128,7 +129,7 @@ if(MJD->time_sec >= SecInDay) { - int extraDays = (int) (MJD->time_sec / SecInDay); + extraDays = (int) (MJD->time_sec / SecInDay); MJD->base_day += extraDays; MJD->time_sec -= extraDays * SecInDay; } @@ -217,11 +218,17 @@ { /* ISO time string for UTC */ /* uses default behaviour for Julian/Gregorian switch over */ - static char DateTime[50]; + /*** + Warning getISOString is not thread safe + as it writes to a static variable DateTime + ***/ + + static char DateTime[50]; int y, m, d, hour, min; int sec1, ysign; double sec; int slen; + char* ptr; breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, 0); @@ -243,7 +250,6 @@ sprintf(DateTime, "-%04d-%02d-%02dT%02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); /* remove trailing white space */ - char * ptr; while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; strcat(&(DateTime[0]), "Z"); } @@ -255,7 +261,6 @@ sprintf(DateTime, "-%04d-%02d-%02d %02d:%02d:%01d%-11.10f", y, m, d, hour, min, sec1, sec ); /* remove trailing white space */ - char * ptr; slen = strlen(DateTime)-1; while( DateTime[slen] == ' ') { Modified: trunk/lib/qsastime/qsastime_extra.h =================================================================== --- trunk/lib/qsastime/qsastime_extra.h 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/qsastime_extra.h 2009-02-05 20:23:08 UTC (rev 9458) @@ -1,3 +1,5 @@ +#ifndef _QSASTIME_EXTRA_H_ +#define _QSASTIME_EXTRA_H_ /* This software originally contributed under the LGPL in January 2009 to PLplot by the @@ -56,3 +58,7 @@ QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); + /*** Warning getISOString is not thread safe ***/ + +#endif + Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-05 20:06:41 UTC (rev 9457) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-05 20:23:08 UTC (rev 9458) @@ -43,6 +43,10 @@ double epoch; int doy; double zeroTest; + + size_t used; + time_t localt; + struct tm *ptm; MJDtime MJD1; MJDtime MJD2; @@ -111,14 +115,30 @@ /* Compare formatting from strftime() */ - size_t used = strfMJD(&(buf[0]), 360, " strfMJD():\n --------\n '%+' \n %c\n %D %F \n %j \n %r \n %s \n %v\n\n", &MJD2, 0); + used = strfMJD(&(buf[0]), 360, " strfMJD():\n --------\n '%+' \n %c\n %D %F \n %j \n %r \n %s \n %v\n\n", &MJD2, 0); printf("chars %d for \n%s\n" , (int) used, buf); /* seconds since 01 Jan 1970 Gregorian for strftime use */ - time_t localt = MJD2.time_sec + (MJD2.base_day - 40587) * 86400; - struct tm *ptm; + localt = (int)MJD2.time_sec + (MJD2.base_day - 40587) * 86400; ptm = gmtime(&localt); - strftime(&(buf[0]), 360, " strftime(): (invalid before 1970)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); +#ifndef _MSC_VER + /* note %s not implement in cygwin 1.5 gcc 3.x nothing printed */ + strftime(&(buf[0]), 360, + " strftime(): (invalid before 1970)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); +#else + /* the following format options are not defined in MSVC (2008) + and are replaced as follows + %e -> %d will print as 01 etc + %D -> %m/%d/%y + %F -> %Y-%m-%d + %r -> %I:%M:%S %p + %s -> %%s - turned into literal as not implemented + + also %c and %p are locale dependent + */ + strftime(&(buf[0]), 360, + " strftime(): (invalid before 1970)\n ------\n '%a %b %d %H:%M:%S UTC %Y' \n %c\n %m/%d/%y %Y-%m-%d \n %j \n %I:%M:%S %p \n %%s not implemented \n %d-%b-%Y", ptm); +#endif printf("%s\n" , buf); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <arj...@us...> - 2009-02-05 20:42:38
|
Revision: 9459 http://plplot.svn.sourceforge.net/plplot/?rev=9459&view=rev Author: arjenmarkus Date: 2009-02-05 20:42:34 +0000 (Thu, 05 Feb 2009) Log Message: ----------- Make all global static - otherwise there is a conflict at link time in Cygwin. Besides, these variables/constants should not "leak" out of the library. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime_extra.c Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 20:23:08 UTC (rev 9458) +++ trunk/lib/qsastime/qsastime.c 2009-02-05 20:42:34 UTC (rev 9459) @@ -26,24 +26,24 @@ /* MJD measures from the start of 17 Nov 1858 */ - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam - Note C libraries use Gregorian only from 14 Sept 1752 + /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam + Note C libraries use Gregorian only from 14 Sept 1752 More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php These routines have been compared with the results of the US Naval Observatory online converter. Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - + In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + */ #include <ctype.h> #include "qsastime.h" - -double SecInDay = 86400; /* we ignore leap seconds */ -int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ -const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; -const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; + +static double SecInDay = 86400; /* we ignore leap seconds */ +static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ +static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; +static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { @@ -150,7 +150,7 @@ /* allow for negative seconds push into previous day even if less than 1 day */ extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; } - + j = MJD->base_day + extra_days; @@ -158,8 +158,8 @@ /* BCE dates */ - j += 678943; - if( j > 0) + j += 678943; + if( j > 0) { /* must be in year BCE 1 (CE year 0) */ year = 0; @@ -177,21 +177,21 @@ { /* Julian Dates */ j += 678943; - + year = (int) ((float)j / 365.25); doy = j - (int)(year * 365.25); - + } - else + else { /* Gregorian Dates */ j += 678941; - + year = (int) ((float)j / 365.2425); lastyear = year - 1; doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - + } return doy; @@ -223,8 +223,8 @@ /* BCE dates */ - j += 678943; - if( j > 0) + j += 678943; + if( j > 0) { /* must be in year BCE 1 (CE year 0) */ *year = 0; @@ -239,10 +239,10 @@ /* j is now always positive */ *month = 0; - + if(*year%4 != 0) { - while(j > MonthStartDOY[*month]) + while(j > MonthStartDOY[*month]) { (*month)++; if(*month == 12) break; @@ -253,7 +253,7 @@ { /* put this year's leap day back as it is done here */ j++; - while(j > MonthStartDOY_L[*month]) + while(j > MonthStartDOY_L[*month]) { (*month)++; if(*month == 12) break; @@ -265,15 +265,15 @@ { /* Julian Dates */ j += 678943; - + *year = (int) ((float)j / 365.25); j = j - (int)(*year * 365.25); - + *month = 0; if(*year%4 != 0) { - while(j > MonthStartDOY[*month]) + while(j > MonthStartDOY[*month]) { (*month)++; if(*month == 12) break; @@ -284,7 +284,7 @@ { /* put leap day back for this year as done here */ j++; - while(j > MonthStartDOY_L[*month]) + while(j > MonthStartDOY_L[*month]) { (*month)++; if(*month == 12) break; @@ -292,19 +292,19 @@ *day = j - MonthStartDOY_L[*month -1]; } } - else + else { /* Gregorian Dates */ j += 678941; - + *year = (int) ((float)j / 365.2425); lastyear = *year - 1; j = j - *year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - + *month = 0; if((*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0) ) { - while(j > MonthStartDOY_L[*month]) + while(j > MonthStartDOY_L[*month]) { (*month)++; if(*month == 12) break; @@ -313,7 +313,7 @@ } else { - while(j > MonthStartDOY[*month]) + while(j > MonthStartDOY[*month]) { (*month)++; if(*month == 12) break; @@ -335,7 +335,7 @@ size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian) { /* Format a text string according to the format string. - Uses the same syntax as strftime() but does not use current locale. + Uses the same syntax as strftime() but does not use current locale. The null terminator is included in len for safety. */ int year, month, day, hour, min, ysign, sec1, second,d,y; @@ -637,7 +637,7 @@ { /* week of year as a number, (00 - 53) start of week is Sunday */ doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 4) % 7; + days_in_wk1 = (MJD->base_day - doy - 4) % 7; w = (doy + 6 - days_in_wk1) / 7; @@ -687,7 +687,7 @@ { /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; + int days_in_wk1 = (MJD->base_day - doy - 3) % 7; if(days_in_wk1 <= 3) w = (doy +6 - days_in_wk1) / 7; /* ensure first week has at least 3 days in this year */ else w = 1 + (doy + 6 - days_in_wk1) / 7; @@ -714,7 +714,7 @@ { /* week of year as a number, (00 - 53) start of week is Monday */ doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 3) % 7; + days_in_wk1 = (MJD->base_day - doy - 3) % 7; w = (doy +6 - days_in_wk1) / 7; @@ -807,7 +807,7 @@ } else if( isdigit(next) != 0 ) { - nplaces = strtol(&(format[i]), NULL, 10); + nplaces = strtol(&(format[i]), NULL, 10); /* numeric value is number of decimal places ( > 0 ) */ sec_fraction = sec - (double) second; Modified: trunk/lib/qsastime/qsastime_extra.c =================================================================== --- trunk/lib/qsastime/qsastime_extra.c 2009-02-05 20:23:08 UTC (rev 9458) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-05 20:42:34 UTC (rev 9459) @@ -26,22 +26,22 @@ /* MJD measures from the start of 17 Nov 1858 */ - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam - Note C libraries use Gregorian only from 14 Sept 1752 + /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam + Note C libraries use Gregorian only from 14 Sept 1752 More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php These routines have been compared with the results of the US Naval Observatory online converter. Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - + In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + */ #include "qsastime_extra.h" - -double MJDtoJD = 2400000.5; -double SecInDay = 86400; /* we ignore leap seconds */ + +static double MJDtoJD = 2400000.5; +static double SecInDay = 86400; /* we ignore leap seconds */ int setFromISOstring(const char* ISOstring, MJDtime *MJD) { @@ -161,14 +161,14 @@ Note Julian Day starts Noon, so convert to MJD first */ MJD->base_day = (int) (JulianDate - MJDtoJD) ; - MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; + MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; } void setFromCDFepoch(double cdfepoch, MJDtime *MJD){ - /* convert cdf epoch double into MJD structure + /* convert cdf epoch double into MJD structure Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ - + double seconds = cdfepoch * 0.001; MJD->base_day = (int) (seconds / 86400.0); @@ -179,9 +179,9 @@ double getCDFepoch(MJDtime *MJD){ - /* convert MJD structure into cdf epoch double + /* convert MJD structure into cdf epoch double Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ - + int days = MJD->base_day + 678941; double seconds = days * SecInDay + MJD->time_sec; return seconds * 1000.; @@ -196,7 +196,7 @@ double getJD(MJDtime *MJD) { /* Return JD as a double */ - double JD = getMJD(MJD) + MJDtoJD; + double JD = getMJD(MJD) + MJDtoJD; return JD; } @@ -218,12 +218,12 @@ { /* ISO time string for UTC */ /* uses default behaviour for Julian/Gregorian switch over */ - /*** + /*** Warning getISOString is not thread safe - as it writes to a static variable DateTime + as it writes to a static variable DateTime ***/ - static char DateTime[50]; + static char DateTime[50]; int y, m, d, hour, min; int sec1, ysign; double sec; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-06 00:03:58
|
Revision: 9461 http://plplot.svn.sourceforge.net/plplot/?rev=9461&view=rev Author: airwin Date: 2009-02-06 00:03:55 +0000 (Fri, 06 Feb 2009) Log Message: ----------- Put in some precautions against overflowing MJD. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-05 21:08:32 UTC (rev 9460) +++ trunk/lib/qsastime/qsastime.c 2009-02-06 00:03:55 UTC (rev 9461) @@ -45,7 +45,7 @@ static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; -void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) +int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { /* convert Gregorian date plus time to MJD */ /* MJD measures from the start of 17 Nov 1858 */ @@ -56,6 +56,14 @@ int leaps, lastyear; + /* Approximate precaution to avoid overflowing integer portion of + MJD. MJD epoch is 1858-11-17. The months, days, etc., portion + of this calculation are only included to guard against + extremely large values being used for some/all of them. */ + if(abs(365.25*(year-1858) + 12.*(month-10) + (day-17) + hour/24. + + min/1440. + sec/86400.) > 2.e9) + return 1; + if(year <= 0) { /* count leap years on Julian Calendar */ @@ -104,7 +112,7 @@ MJD->time_sec -= extraDays * SecInDay; } - return; + return 0; } const char * getDayOfWeek( const MJDtime *MJD) Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-05 21:08:32 UTC (rev 9460) +++ trunk/lib/qsastime/qsastime.h 2009-02-06 00:03:55 UTC (rev 9461) @@ -60,7 +60,7 @@ }MJDtime; -QSASTIMEDLLIMPEXP void setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-06 01:25:41
|
Revision: 9463 http://plplot.svn.sourceforge.net/plplot/?rev=9463&view=rev Author: airwin Date: 2009-02-06 01:25:39 +0000 (Fri, 06 Feb 2009) Log Message: ----------- Indent using emacs default for C programmes. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_extra.c trunk/lib/qsastime/qsastime_extra.h trunk/lib/qsastime/qsastime_test.c trunk/lib/qsastime/qsastimedll.h Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-06 01:17:56 UTC (rev 9462) +++ trunk/lib/qsastime/qsastime.c 2009-02-06 01:25:39 UTC (rev 9463) @@ -24,19 +24,19 @@ */ - /* MJD measures from the start of 17 Nov 1858 */ +/* MJD measures from the start of 17 Nov 1858 */ - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam - Note C libraries use Gregorian only from 14 Sept 1752 - More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php - These routines have been compared with the results of the US Naval Observatory online converter. - Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 +/* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam + Note C libraries use Gregorian only from 14 Sept 1752 + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php + These routines have been compared with the results of the US Naval Observatory online converter. + Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - */ +*/ #include <ctype.h> #include "qsastime.h" @@ -47,838 +47,838 @@ int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { - /* convert Gregorian date plus time to MJD */ - /* MJD measures from the start of 17 Nov 1858 */ + /* convert Gregorian date plus time to MJD */ + /* MJD measures from the start of 17 Nov 1858 */ - /* the int flag Julian forces use of Julian calendar whatever the year */ - /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ - /* Note C libraries use Gregorian only from 14 Sept 1752 onwards */ + /* the int flag Julian forces use of Julian calendar whatever the year */ + /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ + /* Note C libraries use Gregorian only from 14 Sept 1752 onwards */ - int leaps, lastyear; - double dbase_day, time_sec, dextraDays; - int extraDays; + int leaps, lastyear; + double dbase_day, time_sec, dextraDays; + int extraDays; - if(month < 1 || month > 12) - return 1; - if(year <= 0) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ + if(month < 1 || month > 12) + return 1; + if(year <= 0) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ - if(year%4 == 0) - /* left to right associativity means the double constant - value of 365. propagates to make all calculations be - done in double precision without the potential of - integer overflow. The result should be a double which - stores the expected exact integer results of the - calculation with exact representation unless the - result is much larger than the integer overflow limit. */ - dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678943; - else - dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678943; + leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + if(year%4 == 0) + /* left to right associativity means the double constant + value of 365. propagates to make all calculations be + done in double precision without the potential of + integer overflow. The result should be a double which + stores the expected exact integer results of the + calculation with exact representation unless the + result is much larger than the integer overflow limit. */ + dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678943; + else + dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678943; - } - else if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + } + else if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - leaps = (year -1 ) / 4; - if(year%4 == 0) - dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678943; - else - dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678943; - } - else - { - /* count leap years Gregorian Calendar - modern dates */ - /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ - /* leaps = 450 and hence dbase_day of 678941, so subtract it to give MJD day */ + leaps = (year -1 ) / 4; + if(year%4 == 0) + dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678943; + else + dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678943; + } + else + { + /* count leap years Gregorian Calendar - modern dates */ + /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ + /* leaps = 450 and hence dbase_day of 678941, so subtract it to give MJD day */ - lastyear = year - 1; - leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; - if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) - dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678941; - else - dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678941; + lastyear = year - 1; + leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; + if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) + dbase_day = year * 365. + leaps + MonthStartDOY_L[month-1] + day - 678941; + else + dbase_day = year * 365. + leaps + MonthStartDOY[month-1] + day - 678941; - } + } - time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; + time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; - if(time_sec >= SecInDay) - { - dextraDays = (time_sec / SecInDay); - /* precaution against overflowing extraDays. */ - if(abs(dextraDays) > 2.e9) { - return 2; - } - extraDays = (int) (dextraDays); - dbase_day += extraDays; - time_sec -= extraDays * SecInDay; - } - /* precaution against overflowing MJD->base_day. */ - if(abs(dbase_day) > 2.e9){ - return 3; - } else { - /* The exact integer result should be represented exactly in the - double, dbase_day, and its absolute value should be less than - the integer overflow limit. So the cast to int should be - exact. */ - MJD->base_day = (int) dbase_day; - MJD->time_sec = time_sec; - return 0; - } + if(time_sec >= SecInDay) + { + dextraDays = (time_sec / SecInDay); + /* precaution against overflowing extraDays. */ + if(abs(dextraDays) > 2.e9) { + return 2; + } + extraDays = (int) (dextraDays); + dbase_day += extraDays; + time_sec -= extraDays * SecInDay; + } + /* precaution against overflowing MJD->base_day. */ + if(abs(dbase_day) > 2.e9){ + return 3; + } else { + /* The exact integer result should be represented exactly in the + double, dbase_day, and its absolute value should be less than + the integer overflow limit. So the cast to int should be + exact. */ + MJD->base_day = (int) dbase_day; + MJD->time_sec = time_sec; + return 0; + } } const char * getDayOfWeek( const MJDtime *MJD) { - static char *dow = {"Wed\0Thu\0Fri\0Sat\0Sun\0Mon\0Tue"}; - int d = MJD->base_day % 7; - return &(dow[d*4]); + static char *dow = {"Wed\0Thu\0Fri\0Sat\0Sun\0Mon\0Tue"}; + int d = MJD->base_day % 7; + return &(dow[d*4]); } const char * getLongDayOfWeek( const MJDtime *MJD) { - static char *dow = {"Wednesday\0Thursday\0\0Friday\0\0\0\0Saturday\0\0Sunday\0\0\0\0Monday\0\0\0\0Tuesday"}; - int d = MJD->base_day % 7; - return &(dow[d*10]); + static char *dow = {"Wednesday\0Thursday\0\0Friday\0\0\0\0Saturday\0\0Sunday\0\0\0\0Monday\0\0\0\0Tuesday"}; + int d = MJD->base_day % 7; + return &(dow[d*10]); } const char * getMonth( int m) { - static char *months = {"Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"}; - return &(months[(m-1)*4]); + static char *months = {"Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"}; + return &(months[(m-1)*4]); } const char * getLongMonth( int m) { - static char *months = {"January\0\0\0February\0\0March\0\0\0\0\0April\0\0\0\0\0May\0\0\0\0\0\0\0June\0\0\0\0\0\0July\0\0\0\0\0\0August\0\0\0\0September\0October\0\0\0November\0\0December"}; - return &(months[(m-1)*10]); + static char *months = {"January\0\0\0February\0\0March\0\0\0\0\0April\0\0\0\0\0May\0\0\0\0\0\0\0June\0\0\0\0\0\0July\0\0\0\0\0\0August\0\0\0\0September\0October\0\0\0November\0\0December"}; + return &(months[(m-1)*10]); } int getDOY(const MJDtime *MJD, int forceJulian) { - /* Get from Day Of Year */ - int doy, year; + /* Get from Day Of Year */ + int doy, year; - int extra_days,j,lastyear; + int extra_days,j,lastyear; - if(MJD->time_sec >= 0) - { - extra_days = (int) (MJD->time_sec / SecInDay); - } - else - { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } + if(MJD->time_sec >= 0) + { + extra_days = (int) (MJD->time_sec / SecInDay); + } + else + { + /* allow for negative seconds push into previous day even if less than 1 day */ + extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; + } - j = MJD->base_day + extra_days; + j = MJD->base_day + extra_days; - if( j <= -678943) { + if( j <= -678943) { - /* BCE dates */ + /* BCE dates */ - j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - year = (int) ((float)j / 365.25) -1; - doy = j - (int)(year * 365.25); - } + j += 678943; + if( j > 0) + { + /* must be in year BCE 1 (CE year 0) */ + year = 0; + /* subtract nothing from j */ + } + else + { + /* negative years */ + year = (int) ((float)j / 365.25) -1; + doy = j - (int)(year * 365.25); + } - } - else if( j < -100840 || forceJulian == 1) - { - /* Julian Dates */ - j += 678943; + } + else if( j < -100840 || forceJulian == 1) + { + /* Julian Dates */ + j += 678943; - year = (int) ((float)j / 365.25); + year = (int) ((float)j / 365.25); - doy = j - (int)(year * 365.25); + doy = j - (int)(year * 365.25); - } - else - { - /* Gregorian Dates */ - j += 678941; + } + else + { + /* Gregorian Dates */ + j += 678941; - year = (int) ((float)j / 365.2425); - lastyear = year - 1; - doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; + year = (int) ((float)j / 365.2425); + lastyear = year - 1; + doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - } + } - return doy; + return doy; } void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian) { - /* Convert MJD struct into date/time elements */ - /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ - /* There are 678943 days from year 0 to MJD(0) */ + /* Convert MJD struct into date/time elements */ + /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ + /* There are 678943 days from year 0 to MJD(0) */ - int extra_days,j,lastyear; - double seconds; + int extra_days,j,lastyear; + double seconds; - if(MJD->time_sec >= 0) - { - extra_days = (int) (MJD->time_sec / SecInDay); - } - else - { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } + if(MJD->time_sec >= 0) + { + extra_days = (int) (MJD->time_sec / SecInDay); + } + else + { + /* allow for negative seconds push into previous day even if less than 1 day */ + extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; + } - j = MJD->base_day + extra_days; + j = MJD->base_day + extra_days; - if( j <= -678943) { + if( j <= -678943) { - /* BCE dates */ + /* BCE dates */ - j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - *year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - *year = (int) ((float)j / 365.25) -1; - j = j - (int)((*year) * 365.25); - } + j += 678943; + if( j > 0) + { + /* must be in year BCE 1 (CE year 0) */ + *year = 0; + /* subtract nothing from j */ + } + else + { + /* negative years */ + *year = (int) ((float)j / 365.25) -1; + j = j - (int)((*year) * 365.25); + } - /* j is now always positive */ - *month = 0; + /* j is now always positive */ + *month = 0; - if(*year%4 != 0) - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - else - { - /* put this year's leap day back as it is done here */ - j++; - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } - } - else if( j < -100840 || forceJulian == 1) - { - /* Julian Dates */ - j += 678943; + if(*year%4 != 0) + { + while(j > MonthStartDOY[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY[*month -1]; + } + else + { + /* put this year's leap day back as it is done here */ + j++; + while(j > MonthStartDOY_L[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY_L[*month -1]; + } + } + else if( j < -100840 || forceJulian == 1) + { + /* Julian Dates */ + j += 678943; - *year = (int) ((float)j / 365.25); + *year = (int) ((float)j / 365.25); - j = j - (int)(*year * 365.25); + j = j - (int)(*year * 365.25); - *month = 0; - if(*year%4 != 0) - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - else - { - /* put leap day back for this year as done here */ - j++; - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } + *month = 0; + if(*year%4 != 0) + { + while(j > MonthStartDOY[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY[*month -1]; } - else + else { - /* Gregorian Dates */ - j += 678941; + /* put leap day back for this year as done here */ + j++; + while(j > MonthStartDOY_L[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY_L[*month -1]; + } + } + else + { + /* Gregorian Dates */ + j += 678941; - *year = (int) ((float)j / 365.2425); - lastyear = *year - 1; - j = j - *year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; + *year = (int) ((float)j / 365.2425); + lastyear = *year - 1; + j = j - *year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - *month = 0; - if((*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0) ) - { - while(j > MonthStartDOY_L[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY_L[*month -1]; - } - else - { - while(j > MonthStartDOY[*month]) - { - (*month)++; - if(*month == 12) break; - } - *day = j - MonthStartDOY[*month -1]; - } - + *month = 0; + if((*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0) ) + { + while(j > MonthStartDOY_L[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY_L[*month -1]; } + else + { + while(j > MonthStartDOY[*month]) + { + (*month)++; + if(*month == 12) break; + } + *day = j - MonthStartDOY[*month -1]; + } - /* Time part */ + } + + /* Time part */ - seconds = MJD->time_sec - extra_days * SecInDay; - *hour = (int)( seconds / 3600.); - seconds -= (double) *hour * 3600.; - *min = (int) ( seconds / 60.); - *sec = seconds - (double) *min * 60.; + seconds = MJD->time_sec - extra_days * SecInDay; + *hour = (int)( seconds / 3600.); + seconds -= (double) *hour * 3600.; + *min = (int) ( seconds / 60.); + *sec = seconds - (double) *min * 60.; } size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian) { - /* Format a text string according to the format string. - Uses the same syntax as strftime() but does not use current locale. - The null terminator is included in len for safety. */ + /* Format a text string according to the format string. + Uses the same syntax as strftime() but does not use current locale. + The null terminator is included in len for safety. */ - int year, month, day, hour, min, ysign, sec1, second,d,y; - int i, count,secsSince1970; - int nplaces,fmtlen,slen; - char * ptr; - double sec,sec_fraction; - int w,doy,days_in_wk1; - const char *dayText; - const char *monthText; - char DateTime[80]; - size_t posn = 0; - size_t last = len -1; - buf[last] = '\0'; - buf[0] = '\0'; /* force overwrite of old buffer since strnctat() used hereafter */ + int year, month, day, hour, min, ysign, sec1, second,d,y; + int i, count,secsSince1970; + int nplaces,fmtlen,slen; + char * ptr; + double sec,sec_fraction; + int w,doy,days_in_wk1; + const char *dayText; + const char *monthText; + char DateTime[80]; + size_t posn = 0; + size_t last = len -1; + buf[last] = '\0'; + buf[0] = '\0'; /* force overwrite of old buffer since strnctat() used hereafter */ - breakDownMJD(&year, &month, &day, &hour, &min, &sec, MJD, forceJulian); - if(year < 0) - { - ysign = 1; - year =- year; - } - else ysign = 0; + breakDownMJD(&year, &month, &day, &hour, &min, &sec, MJD, forceJulian); + if(year < 0) + { + ysign = 1; + year =- year; + } + else ysign = 0; - second = (int) sec; - sec1 = (int)sec/10; - sec -= (double) sec1*10; + second = (int) sec; + sec1 = (int)sec/10; + sec -= (double) sec1*10; - /* Read format string, character at a time */ - fmtlen = strlen(format); - i=0; - while(i<fmtlen) + /* Read format string, character at a time */ + fmtlen = strlen(format); + i=0; + while(i<fmtlen) + { + char next = format[i]; + if( next == '%') { - char next = format[i]; - if( next == '%') - { - /* format character or escape */ - i++; - next = format[i]; - if(next == '%') - { - /* escaped %, pass it on */ - buf[posn] = next; - posn++; - if(posn >= last) return posn; - } - else if(next == 'a') - { - /* short day name */ - dayText = getDayOfWeek(MJD); - strncat(&(buf[posn]), dayText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'A') - { - /* long day name */ - dayText = getLongDayOfWeek(MJD); - strncat(&(buf[posn]), dayText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'b' || next == 'h') - { - /* short month name */ - monthText = getMonth(month); - strncat(&(buf[posn]), monthText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'B') - { - /* long month name */ - monthText = getLongMonth(month); - strncat(&(buf[posn]), monthText, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'c') - { - /* Date and Time with day of week */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d %04d", dayText, monthText, day, hour, min, second, year ); - else - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d -%04d", dayText, monthText, day, hour, min, second, year ); + /* format character or escape */ + i++; + next = format[i]; + if(next == '%') + { + /* escaped %, pass it on */ + buf[posn] = next; + posn++; + if(posn >= last) return posn; + } + else if(next == 'a') + { + /* short day name */ + dayText = getDayOfWeek(MJD); + strncat(&(buf[posn]), dayText, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'A') + { + /* long day name */ + dayText = getLongDayOfWeek(MJD); + strncat(&(buf[posn]), dayText, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'b' || next == 'h') + { + /* short month name */ + monthText = getMonth(month); + strncat(&(buf[posn]), monthText, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'B') + { + /* long month name */ + monthText = getLongMonth(month); + strncat(&(buf[posn]), monthText, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'c') + { + /* Date and Time with day of week */ + dayText = getDayOfWeek(MJD); + monthText = getMonth(month); + if(ysign == 0) + sprintf(DateTime, "%s %s %02d %02d:%02d:%02d %04d", dayText, monthText, day, hour, min, second, year ); + else + sprintf(DateTime, "%s %s %02d %02d:%02d:%02d -%04d", dayText, monthText, day, hour, min, second, year ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'C') - { - /* year / 100 so, e.g. 1989 is 20th century but comes out as 19 */ - int century = year / 100; - if(ysign == 0) - sprintf(DateTime, "%02d", century ); - else - sprintf(DateTime, "-%02d", century+1 ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'C') + { + /* year / 100 so, e.g. 1989 is 20th century but comes out as 19 */ + int century = year / 100; + if(ysign == 0) + sprintf(DateTime, "%02d", century ); + else + sprintf(DateTime, "-%02d", century+1 ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'd') - { - /* day of month (01 - 31) */ - sprintf(DateTime, "%02d", day); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'd') + { + /* day of month (01 - 31) */ + sprintf(DateTime, "%02d", day); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'D') - { - /* month/day/year */ - int y = year %100; - if(ysign == 0) - sprintf(DateTime, "%02d/%02d/%02d", month, day, y ); - else - sprintf(DateTime, "%02d/%02d/-%02d", month, day, y ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'D') + { + /* month/day/year */ + int y = year %100; + if(ysign == 0) + sprintf(DateTime, "%02d/%02d/%02d", month, day, y ); + else + sprintf(DateTime, "%02d/%02d/-%02d", month, day, y ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'e') - { - /* day of month ( 1 - 31) */ - if(day < 10) - sprintf(DateTime, " %01d", day); - else - sprintf(DateTime, "%02d", day); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'e') + { + /* day of month ( 1 - 31) */ + if(day < 10) + sprintf(DateTime, " %01d", day); + else + sprintf(DateTime, "%02d", day); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'F') - { - /* year-month-day */ - if(ysign == 0) - sprintf(DateTime, "%04d-%02d-%02d", year, month, day ); - else - sprintf(DateTime, "-%04d-%02d-%02d", year, month, day ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'F') + { + /* year-month-day */ + if(ysign == 0) + sprintf(DateTime, "%04d-%02d-%02d", year, month, day ); + else + sprintf(DateTime, "-%04d-%02d-%02d", year, month, day ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'H') - { - /* hour, 24 hour clock (00 - 23) */ - sprintf(DateTime, "%02d", hour); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'H') + { + /* hour, 24 hour clock (00 - 23) */ + sprintf(DateTime, "%02d", hour); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'I') - { - /* hour, 12 hour clock (01 - 12) */ - if(hour == 0) sprintf(DateTime, "%02d", hour+12); - else if(hour > 12) sprintf(DateTime, "%02d", hour-12); - else sprintf(DateTime, "%02d", hour); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'I') + { + /* hour, 12 hour clock (01 - 12) */ + if(hour == 0) sprintf(DateTime, "%02d", hour+12); + else if(hour > 12) sprintf(DateTime, "%02d", hour-12); + else sprintf(DateTime, "%02d", hour); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'j') - { - /* day of year */ - int doy = getDOY(MJD, forceJulian); - sprintf(DateTime, "%03d", doy); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'j') + { + /* day of year */ + int doy = getDOY(MJD, forceJulian); + sprintf(DateTime, "%03d", doy); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'k') - { - /* hour, 24 hour clock ( 0 - 23) */ - if(hour < 10) - sprintf(DateTime, " %01d", hour); - else - sprintf(DateTime, "%02d", hour); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'k') + { + /* hour, 24 hour clock ( 0 - 23) */ + if(hour < 10) + sprintf(DateTime, " %01d", hour); + else + sprintf(DateTime, "%02d", hour); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'l') - { - /* hour, 12 hour clock ( 1 - 12) */ - if(hour == 0) sprintf(DateTime, "%02d", hour+12); - else if(hour < 10) sprintf(DateTime, " %01d", hour); - else if(hour <= 12) sprintf(DateTime, "%02d", hour); - else if(hour < 22) sprintf(DateTime, " %01d", hour-12); - else sprintf(DateTime, "%02d", hour-12); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'l') + { + /* hour, 12 hour clock ( 1 - 12) */ + if(hour == 0) sprintf(DateTime, "%02d", hour+12); + else if(hour < 10) sprintf(DateTime, " %01d", hour); + else if(hour <= 12) sprintf(DateTime, "%02d", hour); + else if(hour < 22) sprintf(DateTime, " %01d", hour-12); + else sprintf(DateTime, "%02d", hour-12); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'm') - { - /* month (01 - 12) */ - sprintf(DateTime, "%02d", month); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'm') + { + /* month (01 - 12) */ + sprintf(DateTime, "%02d", month); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'M') - { - /* minute (00 - 59) */ - sprintf(DateTime, "%02d", min); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'M') + { + /* minute (00 - 59) */ + sprintf(DateTime, "%02d", min); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'n') - { - /* newline */ - buf[posn] = '\n'; - posn++; - if(posn >= last) return posn; - } - else if(next == 'p') - { - /* am/pm on12 hour clock */ - if(hour < 0) sprintf(DateTime, "AM"); - else sprintf(DateTime, "PM"); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'n') + { + /* newline */ + buf[posn] = '\n'; + posn++; + if(posn >= last) return posn; + } + else if(next == 'p') + { + /* am/pm on12 hour clock */ + if(hour < 0) sprintf(DateTime, "AM"); + else sprintf(DateTime, "PM"); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'r') - { - /* hour:min:sec AM, 12 hour clock (01 - 12):(00 - 59):(00 - 59) (AM - PM) */ - if(hour == 0) sprintf(DateTime, "%02d:%02d:%02d AM", hour+12, min, second); - else if(hour > 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour-12, min, second); - else if(hour == 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour, min, second); - else sprintf(DateTime, "%02d:%02d:%02d AM", hour, min, second); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'r') + { + /* hour:min:sec AM, 12 hour clock (01 - 12):(00 - 59):(00 - 59) (AM - PM) */ + if(hour == 0) sprintf(DateTime, "%02d:%02d:%02d AM", hour+12, min, second); + else if(hour > 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour-12, min, second); + else if(hour == 12) sprintf(DateTime, "%02d:%02d:%02d PM", hour, min, second); + else sprintf(DateTime, "%02d:%02d:%02d AM", hour, min, second); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'R') - { - /* hour:min, 24 hour clock (00 - 23):(00 - 59) */ - sprintf(DateTime, "%02d:%02d", hour, min); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'R') + { + /* hour:min, 24 hour clock (00 - 23):(00 - 59) */ + sprintf(DateTime, "%02d:%02d", hour, min); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'S') - { - /* second (00 - 59) */ - sprintf(DateTime, "%02d", second); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'S') + { + /* second (00 - 59) */ + sprintf(DateTime, "%02d", second); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 's') - { - /* seconds since 01 Jan 1970 Gregorian */ - secsSince1970 = (int)(MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay); - sprintf(DateTime, "%d", secsSince1970); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 's') + { + /* seconds since 01 Jan 1970 Gregorian */ + secsSince1970 = (int)(MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay); + sprintf(DateTime, "%d", secsSince1970); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 't') - { - /* tab */ - buf[posn] = '\t'; - posn++; - if(posn >= last) return posn; - } - else if(next == 'T') - { - /* hour:min:sec, 24 hour clock (00 - 23):(00 - 59):(00 - 59) */ - sprintf(DateTime, "%02d:%02d:%02d", hour, min, second); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 't') + { + /* tab */ + buf[posn] = '\t'; + posn++; + if(posn >= last) return posn; + } + else if(next == 'T') + { + /* hour:min:sec, 24 hour clock (00 - 23):(00 - 59):(00 - 59) */ + sprintf(DateTime, "%02d:%02d:%02d", hour, min, second); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'U') - { - /* week of year as a number, (00 - 53) start of week is Sunday */ - doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 4) % 7; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'U') + { + /* week of year as a number, (00 - 53) start of week is Sunday */ + doy = getDOY(MJD, forceJulian); + days_in_wk1 = (MJD->base_day - doy - 4) % 7; - w = (doy + 6 - days_in_wk1) / 7; + w = (doy + 6 - days_in_wk1) / 7; - sprintf(DateTime, "%02d", w); + sprintf(DateTime, "%02d", w); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'u') - { - /* weekday as a number, 0 = Monday */ - d = 1 + (MJD->base_day - 5) % 7; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'u') + { + /* weekday as a number, 0 = Monday */ + d = 1 + (MJD->base_day - 5) % 7; - sprintf(DateTime, "%01d", d); + sprintf(DateTime, "%01d", d); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'v') - { - /* day-MonthName-year day of month ( 1 - 31) - month (Jan ... Dec) - year (yyyy) */ + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'v') + { + /* day-MonthName-year day of month ( 1 - 31) - month (Jan ... Dec) - year (yyyy) */ - monthText = getMonth(month); + monthText = getMonth(month); - if(ysign == 0) - { - if(day < 10) - sprintf(DateTime, " %01d-%s-%04d", day, monthText, year); - else - sprintf(DateTime, "%02d-%s-%04d", day, monthText, year); - } - else - { - if(day < 10) - sprintf(DateTime, " %01d-%s-(-)%04d", day, monthText, year); - else - sprintf(DateTime, "%02d-%s-(-)%04d", day, monthText, year); - } + if(ysign == 0) + { + if(day < 10) + sprintf(DateTime, " %01d-%s-%04d", day, monthText, year); + else + sprintf(DateTime, "%02d-%s-%04d", day, monthText, year); + } + else + { + if(day < 10) + sprintf(DateTime, " %01d-%s-(-)%04d", day, monthText, year); + else + sprintf(DateTime, "%02d-%s-(-)%04d", day, monthText, year); + } - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'V') - { - /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'V') + { + /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ + int doy = getDOY(MJD, forceJulian); + int days_in_wk1 = (MJD->base_day - doy - 3) % 7; - if(days_in_wk1 <= 3) w = (doy +6 - days_in_wk1) / 7; /* ensure first week has at least 3 days in this year */ - else w = 1 + (doy + 6 - days_in_wk1) / 7; + if(days_in_wk1 <= 3) w = (doy +6 - days_in_wk1) / 7; /* ensure first week has at least 3 days in this year */ + else w = 1 + (doy + 6 - days_in_wk1) / 7; - if(w == 0) w = 53; - sprintf(DateTime, "%02d", w); + if(w == 0) w = 53; + sprintf(DateTime, "%02d", w); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'w') - { - /* weekday as a number, 0 = Sunday */ - d = (MJD->base_day - 4) % 7; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'w') + { + /* weekday as a number, 0 = Sunday */ + d = (MJD->base_day - 4) % 7; - sprintf(DateTime, "%01d", d); + sprintf(DateTime, "%01d", d); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'W') - { - /* week of year as a number, (00 - 53) start of week is Monday */ - doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 3) % 7; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'W') + { + /* week of year as a number, (00 - 53) start of week is Monday */ + doy = getDOY(MJD, forceJulian); + days_in_wk1 = (MJD->base_day - doy - 3) % 7; - w = (doy +6 - days_in_wk1) / 7; + w = (doy +6 - days_in_wk1) / 7; - sprintf(DateTime, "%02d", w); + sprintf(DateTime, "%02d", w); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'x') - { - /* date string */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d, %04d", dayText, monthText, day, year ); - else - sprintf(DateTime, "%s %s %02d, -%04d", dayText, monthText, day, year ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'x') + { + /* date string */ + dayText = getDayOfWeek(MJD); + monthText = getMonth(month); + if(ysign == 0) + sprintf(DateTime, "%s %s %02d, %04d", dayText, monthText, day, year ); + else + sprintf(DateTime, "%s %s %02d, -%04d", dayText, monthText, day, year ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'X') - { - /* time string */ - sprintf(DateTime, "%02d:%02d:%02d", hour, min, second ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'X') + { + /* time string */ + sprintf(DateTime, "%02d:%02d:%02d", hour, min, second ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'y') - { - /* 2 digit year */ - y = year %100; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'y') + { + /* 2 digit year */ + y = year %100; - if(ysign == 0) - sprintf(DateTime, "%02d", y ); - else - sprintf(DateTime, "-%02d", y ); + if(ysign == 0) + sprintf(DateTime, "%02d", y ); + else + sprintf(DateTime, "-%02d", y ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'Y') - { - /* 4 digit year */ - if(ysign == 0) - sprintf(DateTime, "%04d", year ); - else - sprintf(DateTime, "-%04d", year ); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'Y') + { + /* 4 digit year */ + if(ysign == 0) + sprintf(DateTime, "%04d", year ); + else + sprintf(DateTime, "-%04d", year ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'Z') - { - /* time zone and calendar, alwaus UTC */ - if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian == 1) - strncat(&(buf[posn]), "UTC Julian", last - posn); - else - strncat(&(buf[posn]), "UTC Gregorian", last - posn); + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'Z') + { + /* time zone and calendar, alwaus UTC */ + if(year < 1582 || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day < 15) || forceJulian == 1) + strncat(&(buf[posn]), "UTC Julian", last - posn); + else + strncat(&(buf[posn]), "UTC Gregorian", last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == 'z') - { - /* time zone, always UTC */ - strncat(&(buf[posn]), "+0000", last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if(next == '+') - { - /* date and time */ - dayText = getDayOfWeek(MJD); - monthText = getMonth(month); - if(ysign == 0) - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC %04d", dayText, monthText, day, hour, min, second, year ); - else - sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC -%04d", dayText, monthText, day, hour, min, second, year ); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == 'z') + { + /* time zone, always UTC */ + strncat(&(buf[posn]), "+0000", last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if(next == '+') + { + /* date and time */ + dayText = getDayOfWeek(MJD); + monthText = getMonth(month); + if(ysign == 0) + sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC %04d", dayText, monthText, day, hour, min, second, year ); + else + sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC -%04d", dayText, monthText, day, hour, min, second, year ); - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if( isdigit(next) != 0 ) - { - nplaces = strtol(&(format[i]), NULL, 10); - /* numeric value is number of decimal places ( > 0 ) */ - sec_fraction = sec - (double) second; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if( isdigit(next) != 0 ) + { + nplaces = strtol(&(format[i]), NULL, 10); + /* numeric value is number of decimal places ( > 0 ) */ + sec_fraction = sec - (double) second; - for(count=0; count<nplaces; count++) sec_fraction *= 10; - sprintf(DateTime, ".%d", (int) sec_fraction); + for(count=0; count<nplaces; count++) sec_fraction *= 10; + sprintf(DateTime, ".%d", (int) sec_fraction); - /* append 0 to pad to length */ - slen = strlen(DateTime); - while(slen < nplaces+1) - { - DateTime[slen] = '0'; - slen++; - DateTime[slen] = '\0'; - } - strncat(&(buf[posn]), DateTime, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - else if( next == '.' ) - { - /* fractional part of seconds to maximum available accuracy */ - sec_fraction = sec - (double) second; - sprintf(DateTime, "%-11.9f", sec_fraction); - while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; /* remove trailing white space */ - slen = strlen(DateTime) -1; - while( DateTime[slen] == '0' && DateTime[slen-1] != '.') { - DateTime[slen] ='\0'; /* remove trailing zeros */ - slen --; - } - - ptr = strchr(DateTime, '.'); /* remove possible lead 0 */ - strncat(&(buf[posn]), ptr, last - posn); - posn = strlen(buf); - if(posn >= last) return posn; - } - } - else + /* append 0 to pad to length */ + slen = strlen(DateTime); + while(slen < nplaces+1) { - /* regular multi-byte character, pass it on */ - buf[posn] = next; - posn++; - if(posn >= last) return posn; + DateTime[slen] = '0'; + slen++; + DateTime[slen] = '\0'; } - buf[posn] = '\0'; - i++; + strncat(&(buf[posn]), DateTime, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } + else if( next == '.' ) + { + /* fractional part of seconds to maximum available accuracy */ + sec_fraction = sec - (double) second; + sprintf(DateTime, "%-11.9f", sec_fraction); + while( ( ptr = strrchr(&(DateTime[0]), ' ')) != NULL) ptr[0] ='\0'; /* remove trailing white space */ + slen = strlen(DateTime) -1; + while( DateTime[slen] == '0' && DateTime[slen-1] != '.') { + DateTime[slen] ='\0'; /* remove trailing zeros */ + slen --; + } + + ptr = strchr(DateTime, '.'); /* remove possible lead 0 */ + strncat(&(buf[posn]), ptr, last - posn); + posn = strlen(buf); + if(posn >= last) return posn; + } } - return posn; + else + { + /* regular multi-byte character, pass it on */ + buf[posn] = next; + posn++; + if(posn >= last) return posn; + } + buf[posn] = '\0'; + i++; + } + return posn; } Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-06 01:17:56 UTC (rev 9462) +++ trunk/lib/qsastime/qsastime.h 2009-02-06 01:25:39 UTC (rev 9463) @@ -26,36 +26,36 @@ */ - /* MJD measures from the start of 17 Nov 1858 */ +/* MJD measures from the start of 17 Nov 1858 */ - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian - Note C libraries use Gregorian only from 14 Sept 1752 - More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php - These routines have been compared with the results of the US Naval Observatory online converter. - Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 +/* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian + Note C libraries use Gregorian only from 14 Sept 1752 + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php + These routines have been compared with the results of the US Naval Observatory online converter. + Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - */ +*/ - #include <stdio.h> - #include <stdlib.h> - #include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> /* include header file for dll definitions */ - #include "qsastimedll.h" +#include "qsastimedll.h" typedef struct MJDtimeStruct { - /* - MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). - The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. - */ + /* + MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). + The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. + */ - int base_day; /* integer part of MJD used as default */ - double time_sec; /* seconds from start of base_day */ + int base_day; /* integer part of MJD used as default */ + double time_sec; /* seconds from start of base_day */ }MJDtime; Modified: trunk/lib/qsastime/qsastime_extra.c =================================================================== --- trunk/lib/qsastime/qsastime_extra.c 2009-02-06 01:17:56 UTC (rev 9462) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-06 01:25:39 UTC (rev 9463) @@ -24,19 +24,19 @@ */ - /* MJD measures from the start of 17 Nov 1858 */ +/* MJD measures from the start of 17 Nov 1858 */ - /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam - Note C libraries use Gregorian only from 14 Sept 1752 - More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php - These routines have been compared with the results of the US Naval Observatory online converter. - Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 +/* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregoriam + Note C libraries use Gregorian only from 14 Sept 1752 + More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php + These routines have been compared with the results of the US Naval Observatory online converter. + Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + In all routines, specifying a day, hour, minute or second field greater than would be valid is + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - */ +*/ #include "qsastime_extra.h" @@ -45,230 +45,229 @@ int setFromISOstring(const char* ISOstring, MJDtime *MJD) { - double seconds; - int y, m, d, h, min; - int startAt=0; - int len = strlen(ISOstring); + double seconds; + int y, m, d, h, min; + int startAt=0; + int len = strlen(ISOstring); - /* ISO is "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z" */ + /* ISO is "1995-01-23 02:33:17.235" or "1995-01-23T02:33:17.235Z" */ - /* parse off year */ + /* parse off year */ - y = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 5; - if(startAt > len) return 1; + y = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 5; + if(startAt > len) return 1; - m = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; + m = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; - d = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; + d = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; - h = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; + h = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; - min = strtol(&(ISOstring[startAt]), NULL, 10); - startAt += 3; - if(startAt > len) return 1; + min = strtol(&(ISOstring[startAt]), NULL, 10); + startAt += 3; + if(startAt > len) return 1; - seconds = strtod(&(ISOstring[startAt]), NULL); - setFromUT(y, m, d, h, min, seconds, MJD, 0); + seconds = strtod(&(ISOstring[startAt]), NULL); + setFromUT(y, m, d, h, min, seconds, MJD, 0); - return 0; + return 0; } void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { - /* Set from Day Of Year format */ + /* Set from Day Of Year format */ - /* convert Gregorian date plus time to MJD */ - /* MJD measures from the start of 17 Nov 1858 */ + /* convert Gregorian date plus time to MJD */ + /* MJD measures from the start of 17 Nov 1858 */ - /* the int flag forceJulian forces use of Julian calendar whatever the year */ - /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ - /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ + /* the int flag forceJulian forces use of Julian calendar whatever the year */ + /* default is to use Gregorian after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian */ + /* Note C libraries use Gregorian only from 14 Sept 1752 onwards*/ - int leaps, lastyear,extraDays; + int leaps, lastyear,extraDays; - if(year <= 0) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ + if(year <= 0) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ - MJD->base_day = year * 365 + leaps + doy - 678943; + leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + MJD->base_day = year * 365 + leaps + doy - 678943; - } - else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) - { - /* count leap years on Julian Calendar */ - /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ + } + else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) + { + /* count leap years on Julian Calendar */ + /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ - leaps = (year -1 ) / 4; - MJD->base_day = year * 365 + leaps + doy - 678943; + leaps = (year -1 ) / 4; + MJD->base_day = year * 365 + leaps + doy - 678943; - } - else - { - /* count leap years Gregorian Calendar - modern dates */ - /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ - /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ + } + else + { + /* count leap years Gregorian Calendar - modern dates */ + /* Algorithm below for 17 Nov 1858 (0 MJD) gives */ + /* leaps = 450 and hence base_day of 678941, so subtract it to give MJD day */ - lastyear = year - 1; - leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; - MJD->base_day = year * 365 + leaps + doy - 678941; + lastyear = year - 1; + leaps = lastyear / 4 - lastyear / 100 + lastyear / 400; + MJD->base_day = year * 365 + leaps + doy - 678941; - } + } - MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; + MJD->time_sec = sec + ( (double) min + (double) hour * 60. ) * 60.; - if(MJD->time_sec >= SecInDay) - { - extraDays = (int) (MJD->time_sec / SecInDay); - MJD->base_day += extraDays; - MJD->time_sec -= extraDays * SecInDay; - } + if(MJD->time_sec >= SecInDay) + { + extraDays = (int) (MJD->time_sec / SecInDay); + MJD->base_day += extraDays; + MJD->time_sec -= extraDays * SecInDay; + } - return; + return; } void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD) { - /* utility to allow user to input dates BCE (BC) */ + /* utility to allow user to input dates BCE (BC) */ - int year = 1 - yearBCE; - setFromUT(year, month, day, hour, min, sec, MJD, 0); + int year = 1 - yearBCE; + setFromUT(year, month, day, hour, min, sec, MJD, 0); } void setFromMJD(double ModifiedJulianDate, MJDtime *MJD) { - /* convert MJD double into MJD structure */ - MJD->base_day = (int) ModifiedJulianDate; - MJD->time_sec = (ModifiedJulianDate - MJD->base_day) * SecInDay; + /* convert MJD double into MJD structure */ + MJD->base_day = (int) ModifiedJulianDate; + MJD->time_sec = (ModifiedJulianDate - MJD->base_day) * SecInDay; } void setFromJD(double JulianDate, MJDtime *MJD) { - /* break JD double into MJD based structure - Note Julian Day starts Noon, so convert to MJD first */ + /* break JD double into MJD based structure + Note Julian Day starts Noon, so convert to MJD first */ - MJD->base_day = (int) (JulianDate - MJDtoJD) ; - MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; + MJD->base_day = (int) (JulianDate - MJDtoJD) ; + MJD->time_sec = (JulianDate - MJDtoJD - (double) MJD->base_day) * SecInDay; } void setFromCDFepoch(double cdfepoch, MJDtime *MJD){ - /* convert cdf epoch double into MJD structure - Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ + /* convert cdf epoch double into MJD structure + Note that cdfepoch is msec from 0 AD on the Gregorian calendar */ - double seconds = cdfepoch * 0.001; + double seconds = cdfepoch * 0.001; - MJD->base_day = (int) (seconds / 86400.0); - MJD->time_sec = seconds - MJD->base_day * SecInDay; - MJD->base_day -= 678941; + MJD->base_day = (int) (seconds / 86400.0); + MJD->time_sec = seconds - MJD->base_day * SecInDay; + MJD->base_day -= 678941; } double getCDFepoch(MJDtime *MJD){ - /* convert MJD structure into cdf epoch double - Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ + /* convert MJD structure into cdf epoch double + Note that cdfepoch is msec from 0 AD on the Gregorian Calendar */ - int days = MJD->base_day + 678941; - double seconds = days * SecInDay + MJD->time_sec; - return seconds * 1000.; + int days = MJD->base_day + 678941; + double seconds = days * SecInDay + MJD->time_sec; + return seconds * 1000.; } double getMJD(MJDtime *MJD) { - /* Return MJD as a double */ - return (double) MJD->base_day + MJ... [truncated message content] |
From: <arj...@us...> - 2009-02-06 05:14:32
|
Revision: 9464 http://plplot.svn.sourceforge.net/plplot/?rev=9464&view=rev Author: arjenmarkus Date: 2009-02-06 05:14:29 +0000 (Fri, 06 Feb 2009) Log Message: ----------- Removing trailing blanks Modified Paths: -------------- trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_extra.h trunk/lib/qsastime/qsastime_test.c trunk/lib/qsastime/qsastimedll.h Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-06 01:25:39 UTC (rev 9463) +++ trunk/lib/qsastime/qsastime.h 2009-02-06 05:14:29 UTC (rev 9464) @@ -29,15 +29,15 @@ /* MJD measures from the start of 17 Nov 1858 */ /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian - Note C libraries use Gregorian only from 14 Sept 1752 + Note C libraries use Gregorian only from 14 Sept 1752 More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php These routines have been compared with the results of the US Naval Observatory online converter. Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - + In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + */ #include <stdio.h> @@ -48,12 +48,12 @@ typedef struct MJDtimeStruct -{ - /* +{ + /* MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. */ - + int base_day; /* integer part of MJD used as default */ double time_sec; /* seconds from start of base_day */ @@ -64,7 +64,7 @@ QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); -/* The following are externally accessible for now only because +/* The following are externally accessible for now only because the test routine calls them directly */ QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); Modified: trunk/lib/qsastime/qsastime_extra.h =================================================================== --- trunk/lib/qsastime/qsastime_extra.h 2009-02-06 01:25:39 UTC (rev 9463) +++ trunk/lib/qsastime/qsastime_extra.h 2009-02-06 05:14:29 UTC (rev 9464) @@ -29,15 +29,15 @@ /* MJD measures from the start of 17 Nov 1858 */ /* These utilities use the Gregorian calendar after 4 Oct 1582 (Julian) i.e. from 15 Oct 1582 Gregorian - Note C libraries use Gregorian only from 14 Sept 1752 + Note C libraries use Gregorian only from 14 Sept 1752 More detailed discussion can be found at http://aa.usno.navy.mil/data/docs/JulianDate.php These routines have been compared with the results of the US Naval Observatory online converter. Modified Julian Date (MJD) = Julian Date (JD) - 2400000.5 - + In all routines, specifying a day, hour, minute or second field greater than would be valid is - handled with modulo arithmetic and safe. - Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 - + handled with modulo arithmetic and safe. + Thus 2006-12-32 00:62:00.0 will safely, and correctly, be treated as 2007-01-01 01:02:00.0 + */ #include <stdio.h> Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-06 01:25:39 UTC (rev 9463) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-06 05:14:29 UTC (rev 9464) @@ -87,7 +87,7 @@ printf("CDF epoch sec %18.3f\n", epoch); setFromCDFepoch(epoch, &MJD2); printf("from CDF ISO string (CDF epoch is accurate to msec only) = '%s'\n" , getISOString(&MJD2, 1)); - + printf("Day of week is/was %s\n\n", getDayOfWeek(&MJD2)); ISOstring = getISOString(&MJD1,0); @@ -126,9 +126,9 @@ strftime(&(buf[0]), 360, " strftime(): (invalid before 1970)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); #else - /* the following format options are not defined in MSVC (2008) + /* the following format options are not defined in MSVC (2008) and are replaced as follows - %e -> %d will print as 01 etc + %e -> %d will print as 01 etc %D -> %m/%d/%y %F -> %Y-%m-%d %r -> %I:%M:%S %p Modified: trunk/lib/qsastime/qsastimedll.h =================================================================== --- trunk/lib/qsastime/qsastimedll.h 2009-02-06 01:25:39 UTC (rev 9463) +++ trunk/lib/qsastime/qsastimedll.h 2009-02-06 05:14:29 UTC (rev 9464) @@ -16,13 +16,13 @@ #define QSASTIMEDLLIMPORT __declspec(dllimport) #elif defined(__GNUC__) && __GNUC__ > 3 /* Follow ideas in http://gcc.gnu.org/wiki/Visibility for GCC version 4.x - * The following forces exported symbols specifically designated with + * The following forces exported symbols specifically designated with * QSASTIMEDLLEXPORT to be visible. */ #define QSASTIMEDLLEXPORT __attribute__ ((visibility("default"))) #define QSASTIMEDLLIMPORT #endif #endif - + /* For an unknown compiler or static built we clear the macros */ #ifndef QSASTIMEDLLEXPORT # define QSASTIMEDLLEXPORT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-07 03:49:51
|
Revision: 9466 http://plplot.svn.sourceforge.net/plplot/?rev=9466&view=rev Author: airwin Date: 2009-02-07 03:49:47 +0000 (Sat, 07 Feb 2009) Log Message: ----------- Initial commit of new test routine to compare libqsastime results with equivalent results from the _Linux_ C library on 64-bit systems (i.e., without the time_t range limitations that occur on 32-bit systems). Current status of the test is setFromUT (in a new special forced Gregorian calendar mode for all dates since that is what the Linux C library uses) and timegm produce the same results (delta time_t values of 0 seconds) back to 1 CE, but for lesser times, there are leap day discrepancies which I am currently investigating. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt Added Paths: ----------- trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-06 19:36:00 UTC (rev 9465) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-07 03:49:47 UTC (rev 9466) @@ -58,5 +58,15 @@ # qsastime_extra.[ch] provides helper functions for qsastime_test that should # not be part of the library. -add_executable(qsastime_test qsastime_test.c qsastime_extra.c qsastime_extra.h) + +add_executable(qsastime_test qsastime_test.c qsastime_extra.c) target_link_libraries(qsastime_test qsastime) + +# Routine for testing just the library functions against equivalent +# Linux C library routines for 64-bit platforms. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + # N.B. the routine immediately errors out if sizeof(time_t) < 8 so + # it effectively only works on 64-bit Linux platforms. + add_executable(qsastime_testlib qsastime_testlib.c) + target_link_libraries(qsastime_testlib qsastime) +endif(CMAKE_SYSTEM_NAME STREQUAL "Linux") Added: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c (rev 0) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-07 03:49:47 UTC (rev 9466) @@ -0,0 +1,91 @@ +/* + Copyright (C) 2009 Alan W. Irwin + + This file is part of PLplot. + + PLplot is free software; you can redistribute it and/or modify + it under the terms of the GNU General Library Public License as published + by the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + PLplot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with PLplot; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ +#include "qsastime.h" +#include <time.h> +#include <stdio.h> +#include <stdlib.h> +/* Test program to do extensive comparisons between setFromUT, breakDownMJD, + and strfMJD and the closest corresponding _Linux_ C library routines, + timegm, gmtime, and strftime. */ + +int main() +{ + char buf[360]; + char buf1[360]; + int year; + int month=0; + int day = 1; + int hour = 0; + int min = 0; + double sec = 0.; + struct tm tm; + struct tm *ptm = &tm; + time_t secs_past_epoch, secs_past_epoch1; + + MJDtime MJD1, *pMJD1 = &MJD1; + MJDtime MJD2; + static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ + printf("sizeof(int) = %d\n",(int)sizeof(int)); + printf("sizeof(time_t) = %d\n",(int)sizeof(time_t)); + if(sizeof(time_t) < 8) { + printf("time_t too small on this platform to run this programme"); + return 1; + } + + /* strftime affected by locale so force 0 timezone for this complete test. */ + setenv("TZ", "", 1); + tzset(); + + // test wide range of years that almost integer overflows on each end + // and which definitely overflow the MJD integer. + //for (year=-2000000000; year<=2000000000; year+=1000000000) { + // test small range which nevertheless exceeds 32-bit date range + //for (year=1900; year<=2100; year++) { + // test reduced range of years that just barely misses overflowing + // the MJD integer. e.g., 6000000 overflows it. + //for (year=-5000000; year<=5000000; year+=1000000) { + for (year=-10; year<=10; year+=1) { + ptm->tm_year = year-1900; + ptm->tm_mon = month; + ptm->tm_mday = day; + ptm->tm_hour = hour; + ptm->tm_min = min; + ptm->tm_sec = (int) sec; + + printf("year = %d\n", year); + setFromUT(year, month, day, hour, min, sec, pMJD1, -1); + secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); + secs_past_epoch = timegm(ptm); + printf("delta secs_past_epoch = %d seconds\n", (secs_past_epoch1 - secs_past_epoch)); + strftime(&(buf[0]), 360, "strftime gives %Y-%m-%d %H:%M:%S", ptm); + printf("%s\n", buf); + + ptm = gmtime(&secs_past_epoch); + printf("ptm-> year, month, day, hour, minute, sec = %d-%d-%d %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); + + /* next step for wide range of years loop alternative would overflow year so get out of loop this way. */ + if(year==2000000000) { + break; + } + + } + return 0; +} Property changes on: trunk/lib/qsastime/qsastime_testlib.c ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-09 21:01:51
|
Revision: 9480 http://plplot.svn.sourceforge.net/plplot/?rev=9480&view=rev Author: airwin Date: 2009-02-09 21:01:38 +0000 (Mon, 09 Feb 2009) Log Message: ----------- AWI for Tony Allen. Fix bugs in negative years and negative Julian dates for breakDownMJD and associated helper and extra functions. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime_extra.c Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-09 10:47:34 UTC (rev 9479) +++ trunk/lib/qsastime/qsastime.c 2009-02-09 21:01:38 UTC (rev 9480) @@ -79,6 +79,7 @@ year100 = year - 1; year400 = year - 1; } + if((forceJulian == 0 && (year < 1582 || (year == 1582 && month < 9) || (year == 1582 && month == 9 && day < 15))) || forceJulian == 1) { /* count leap years on proleptic Julian Calendar */ @@ -147,6 +148,7 @@ { static char *dow = {"Wed\0Thu\0Fri\0Sat\0Sun\0Mon\0Tue"}; int d = MJD->base_day % 7; + if(d < 0) d += 7; return &(dow[d*4]); } @@ -154,6 +156,7 @@ { static char *dow = {"Wednesday\0Thursday\0\0Friday\0\0\0\0Saturday\0\0Sunday\0\0\0\0Monday\0\0\0\0Tuesday"}; int d = MJD->base_day % 7; + if(d < 0) d += 7; return &(dow[d*10]); } @@ -190,33 +193,37 @@ j = MJD->base_day + extra_days; - if( j <= -678943) { + if( j < -678943) { - /* BCE dates */ + /* Negative CE dates */ - j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - year = (int) ((float)j / 365.25) -1; - doy = j - (int)(year * 365.25); - } + j += 678943; - } + /* negative years */ + year = (int) ((float)(j-365) / 365.25); + doy = j +1 - year * 365.25; + + } + else if( j < -678577) { + + /* CE = 0, BCE = 1 dates */ + + j += 678943; + + /* negative years */ + year = 0; + doy = j +1; + + } else if( j < -100840 || forceJulian == 1) { /* Julian Dates */ j += 678943; year = (int) ((float)j / 365.25); - - doy = j - (int)(year * 365.25); + lastyear = year - 1; + doy = j - year * 365 - lastyear / 4; + } else @@ -255,23 +262,22 @@ j = MJD->base_day + extra_days; - if( j <= -678943) { + if( j <= -678577) { /* BCE dates */ j += 678943; - if( j > 0) - { - /* must be in year BCE 1 (CE year 0) */ - *year = 0; - /* subtract nothing from j */ - } - else - { - /* negative years */ - *year = (int) ((float)j / 365.25) -1; - j = j - (int)((*year) * 365.25); - } + if( j>=0) + { + *year = 0; + j++; + } + else + { + /* negative years */ + *year = (int) ((float)(j-365) / 365.25); + j = j +1 - *year * 365.25; + } /* j is now always positive */ *month = -1; @@ -287,8 +293,6 @@ } else { - /* put this year's leap day back as it is done here */ - j++; while(j > MonthStartDOY_L[*month +1]) { (*month)++; @@ -304,7 +308,8 @@ *year = (int) ((float)j / 365.25); - j = j - (int)(*year * 365.25); + lastyear = *year - 1; + j = j - *year * 365 - lastyear / 4; *month = -1; if(*year%4 != 0) @@ -318,8 +323,6 @@ } else { - /* put leap day back for this year as done here */ - j++; while(j > MonthStartDOY_L[*month + 1]) { (*month)++; Modified: trunk/lib/qsastime/qsastime_extra.c =================================================================== --- trunk/lib/qsastime/qsastime_extra.c 2009-02-09 10:47:34 UTC (rev 9479) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-09 21:01:38 UTC (rev 9480) @@ -55,6 +55,7 @@ /* parse off year */ y = strtol(&(ISOstring[startAt]), NULL, 10); + if(ISOstring[startAt] == '-' || ISOstring[startAt] == '+') startAt++; startAt += 5; if(startAt > len) return 1; @@ -100,7 +101,7 @@ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ /* negative CE (AD) years convert to BCE (BC) as BCE = 1 - CE, e.g. 2 BCE = -1 CE */ - leaps = year / 4 - 1 ; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ + leaps = (year -4) / 4; /* (note leaps is negative here and year 0 (1 BCE) was a leap year */ MJD->base_day = year * 365 + leaps + doy - 678943; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-10 08:07:29
|
Revision: 9491 http://plplot.svn.sourceforge.net/plplot/?rev=9491&view=rev Author: airwin Date: 2009-02-10 08:07:26 +0000 (Tue, 10 Feb 2009) Log Message: ----------- Use my_timegm POSIX equivalent to timegm so both Linux platforms and non-Linux POSIX platforms can run qsastime_testlib. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-10 07:19:37 UTC (rev 9490) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-10 08:07:26 UTC (rev 9491) @@ -62,11 +62,14 @@ add_executable(qsastime_test qsastime_test.c qsastime_extra.c) target_link_libraries(qsastime_test qsastime) -# Routine for testing just the library functions against equivalent -# Linux C library routines for 64-bit platforms. -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - # N.B. the routine immediately errors out if sizeof(time_t) < 8 so - # it effectively only works on 64-bit Linux platforms. - add_executable(qsastime_testlib qsastime_testlib.c) - target_link_libraries(qsastime_testlib qsastime) -endif(CMAKE_SYSTEM_NAME STREQUAL "Linux") +# Routine for testing just the library functions against their library +# inverses (to test self-consistency when such inverses exist) and also +# equivalent C library routines. +# N.B. the routine immediately errors out if sizeof(time_t) < 8 or +# sizeof(int) !=4. The time_t constraint is because we want access to a large +# C library date range to do the tests. The int constraint is so we +# emulate library results on 32-bit systems. +# The test executable normally only passes these two criteria for +# 64-bit platforms. +add_executable(qsastime_testlib qsastime_testlib.c) +target_link_libraries(qsastime_testlib qsastime) Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-10 07:19:37 UTC (rev 9490) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-10 08:07:26 UTC (rev 9491) @@ -40,6 +40,25 @@ #define TEST15 0x4000 #define TEST16 0x8000 +/* Recommended (by Linux timegm man page) POSIX equivalent of Linux timegm C library function */ +my_timegm(struct tm *tm) +{ + time_t ret; + char *tz; + + tz = getenv("TZ"); + setenv("TZ", "", 1); + tzset(); + ret = mktime(tm); + if (tz) + setenv("TZ", tz, 1); + else + unsetenv("TZ"); + tzset(); + return ret; +} + + /* Test program to do extensive comparisons between setFromUT, breakDownMJD, and strfMJD and the closest corresponding _Linux_ C library routines, timegm, gmtime, and strftime. */ @@ -144,9 +163,9 @@ //for (year=-5000000; year<=5000000; year+=1) { max_delta_secs = 0; ptm->tm_year = 2008-1900; - secs1 = timegm(ptm); + secs1 = my_timegm(ptm); ptm->tm_year = 2010-1900; - secs2 = timegm(ptm); + secs2 = my_timegm(ptm); for (secs=secs1; secs<=secs2; secs+=1) { pMJD1->base_day = MJD_1970 + secs/86400; pMJD1->time_sec = secs % 86400; @@ -167,21 +186,21 @@ ptm->tm_year = year-1900; //printf("year = %d\n", year); - // Test to compare setFromUT and timegm results. + // Test to compare setFromUT and my_timegm results. setFromUT(year, month, day, hour, min, sec, pMJD1, -1); secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); if(pMJD1->time_sec != 0.) { printf("non-zero pMJD1->time_sec value is %25.16f seconds so take early exit.\n", pMJD1->time_sec); return 2; } - secs_past_epoch = timegm(ptm); + secs_past_epoch = my_timegm(ptm); delta_secs = abs(secs_past_epoch1-secs_past_epoch); max_delta_secs = (max_delta_secs > delta_secs ? max_delta_secs: delta_secs); } if(0) { printf("setFromUT secs_past_epoch = %lld seconds\n", secs_past_epoch1); - printf(" timegm secs_past_epoch = %lld seconds\n", secs_past_epoch); + printf("my_timegm secs_past_epoch = %lld seconds\n", secs_past_epoch); printf("delta secs_past_epoch = %d seconds\n", (secs_past_epoch1 - secs_past_epoch)); strftime(&(buf[0]), 360, "strftime gives %Y-%m-%d %H:%M:%S", ptm); printf("%s\n", buf); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-13 09:45:46
|
Revision: 9522 http://plplot.svn.sourceforge.net/plplot/?rev=9522&view=rev Author: airwin Date: 2009-02-13 09:45:41 +0000 (Fri, 13 Feb 2009) Log Message: ----------- Reorganize code so that getYAD (a replacement for getDOY) determines the year and day of year with well-tested code that is called whenever those data (or just day of year) are needed. Part of this reorganization required a new function, normalize_MJD which does just that, and which makes work with MJD's much more reliable. The result of this reorganization passed all of tests 1-4, i.e., gave identical qsastime_testlib results. Because these tests are extremely comprehensive, I am pretty sure the fundamental logic of qsastime.c has now been finalized, and no further fundamental reorganization of that library code is planned. However, additional changes at a higher level (i.e., wrapper functions) mentioned in README.qsastime_API are still planned. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_test.c Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-13 04:26:16 UTC (rev 9521) +++ trunk/lib/qsastime/qsastime.c 2009-02-13 09:45:41 UTC (rev 9522) @@ -155,105 +155,19 @@ } } -int getDOY(const MJDtime *MJD, int forceJulian) +void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian) { - /* Get from Day Of Year */ - int doy, year; + /* Get year and day of year from normalized MJD */ - int extra_days,j,lastyear; - + int j, ifcorrect, year4, year100, year400; if(forceJulian < -1 || forceJulian > 1) { - fprintf(stderr, "getDOY: invalid forceJulian value\n"); + fprintf(stderr, "getYAD: invalid forceJulian value\n"); exit(EXIT_FAILURE); } - if(MJD->time_sec >= 0) - { - extra_days = (int) (MJD->time_sec / SecInDay); - } - else - { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } - - j = MJD->base_day + extra_days; + j = MJD->base_day; - if(forceJulian != -1 && j < MJD_0000J) { - - /* Change epoch so j is measured in days after 0000-01-01 on the - Julian proleptic calendar. */ - - j -= MJD_0000J; - - /* j must be strictly negative from above logic. Therefore, year must be - strictly negative as well. */ - year = (int) ((double)(j-365) / 365.25); - doy = j +1 - year * 365.25; - - } else if(forceJulian != -1 && j < MJD_0001J ) { - /* in year 0 which was a leap year. */ - - j -= MJD_0000J; - - year = 0; - doy = j +1; - - } else if( forceJulian != -1 && (j < -100840 || forceJulian == 1)) { - j -= MJD_0000J; - year = (int) ((double)j / 365.25); - lastyear = year - 1; - doy = j - year * 365 - lastyear / 4; - } else { - /* forceJulian == -1 || (j >= -100840 && forceJulian == 0) */ - /* Change epoch so j is measured in days after 0000-01-01 on the - Gregorian proleptic calendar. */ - j -= MJD_0000G; - - year = (int) ((double)j / 365.2425); - lastyear = year - 1; - doy = j - year * 365 - lastyear / 4 + lastyear / 100 - lastyear / 400; - } - - return doy; -} - -void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian) -{ - /* Convert MJD struct into date/time elements */ - /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ - - int extra_days, j, doy, ifcorrect, year4, year100, year400, ifleapyear; - double seconds; - - if(forceJulian < -1 || forceJulian > 1) { - fprintf(stderr, "breakDownMJD: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } - if(MJD->time_sec >= 0) { - extra_days = (int) (MJD->time_sec / SecInDay); - } else { - /* allow for negative seconds push into previous day even if less than 1 day */ - extra_days = (int) (MJD->time_sec / SecInDay) - 1 ; - } - - j = MJD->base_day + extra_days; - - if( 0 && forceJulian != -1 && j < MJD_0001J) { - - j -= MJD_0000J; - if( j>=0) { - *year = 0; - j++; - } else { - /* negative years */ - *year = (int) ((double)(j-365) / 365.25); - j = j + 1 - *year * 365.25; - } - ifleapyear = *year%4 == 0; - /* j is now always positive */ - - } else if( forceJulian !=-1 && (j < -100840 || forceJulian == 1)) { + if( forceJulian !=-1 && (j < -100840 || forceJulian == 1)) { /* Shift j epoch to 0000-01-01 for the Julian proleptic calendar.*/ j -= MJD_0000J; @@ -269,9 +183,9 @@ year4 = *year-4; } - doy = j - *year * 365 - year4 / 4; + *doy = j - *year * 365 - year4 / 4; - ifleapyear = *year%4 == 0; + *ifleapyear = *year%4 == 0; } else { /* forceJulian == -1 || (j >= -100840 && forceJulian == 0) */ @@ -294,14 +208,14 @@ year400 = *year - 400; } - doy = j - *year * 365 - year4 / 4 + year100 / 100 - year400 / 400; - ifleapyear = (*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0); + *doy = j - *year * 365 - year4 / 4 + year100 / 100 - year400 / 400; + *ifleapyear = (*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0); /* Rare corrections to above average Gregorian relations. */ - if(doy < 1) { + if(*doy < 1) { (*year)--; ifcorrect = 1; - } else if(doy > 365 && (!ifleapyear || doy > 366)) { + } else if(*doy > 365 && (!*ifleapyear || *doy > 366)) { (*year)++; ifcorrect = 1; } else { @@ -318,11 +232,53 @@ year400 = *year - 400; } - doy = j - *year * 365 - year4 / 4 + year100 / 100 - year400 / 400; - ifleapyear = (*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0); + *doy = j - *year * 365 - year4 / 4 + year100 / 100 - year400 / 400; + *ifleapyear = (*year%4 == 0 && *year%100 != 0) || (*year%4 == 0 && *year%400 == 0); } } +} + +void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin) +{ + int extra_days; + /* Calculate MJDout as normalized version + (i.e., 0. <= MJDout->time_sec < 86400.) of MJDin. */ + if(MJDin->time_sec >= 0) { + extra_days = (int) (MJDin->time_sec / SecInDay); + } else { + /* allow for negative seconds push into previous day even if less than 1 day */ + extra_days = (int) (MJDin->time_sec / SecInDay) - 1 ; + } + + MJDout->base_day = MJDin->base_day + extra_days; + MJDout->time_sec = MJDin->time_sec - extra_days * SecInDay; +} + +void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian) +{ + /* Convert MJD struct into date/time elements */ + /* Note year 0 CE (AD) [1 BCE (BC)] is a leap year */ + + int doy, ifleapyear; + MJDtime nMJD, *pnMJD=&nMJD; + + if(forceJulian < -1 || forceJulian > 1) { + fprintf(stderr, "breakDownMJD: invalid forceJulian value\n"); + exit(EXIT_FAILURE); + } + + normalize_MJD(pnMJD, MJD); + /* Time part */ + + *sec = pnMJD->time_sec; + *hour = (int)( *sec / 3600.); + *sec -= (double) *hour * 3600.; + *min = (int) ( *sec / 60.); + *sec -= (double) *min * 60.; + + getYAD(year, &ifleapyear, &doy, pnMJD, forceJulian); + /* calculate month part with doy set to be the day within the year in the range from 1 to 366 */ *month = -1; @@ -339,13 +295,6 @@ } *day = doy - MonthStartDOY[*month]; } - /* Time part */ - - seconds = MJD->time_sec - extra_days * SecInDay; - *hour = (int)( seconds / 3600.); - seconds -= (double) *hour * 3600.; - *min = (int) ( seconds / 60.); - *sec = seconds - (double) *min * 60.; } const char * getDayOfWeek( const MJDtime *MJD) @@ -383,7 +332,8 @@ Uses the same syntax as strftime() but does not use current locale. The null terminator is included in len for safety. */ - int year, month, day, hour, min, ysign, sec1, second,d,y; + int year, month, day, hour, min, ysign, sec1, second, d, y; + int y1, ifleapyear; int i, count,secsSince1970; int nplaces,fmtlen,slen; char * ptr; @@ -394,10 +344,14 @@ char DateTime[80]; size_t posn = 0; size_t last = len -1; + MJDtime nMJD, *pnMJD=&nMJD; + + normalize_MJD(pnMJD, MJD); + buf[last] = '\0'; buf[0] = '\0'; /* force overwrite of old buffer since strnctat() used hereafter */ - breakDownMJD(&year, &month, &day, &hour, &min, &sec, MJD, forceJulian); + breakDownMJD(&year, &month, &day, &hour, &min, &sec, pnMJD, forceJulian); if(year < 0) { ysign = 1; @@ -430,7 +384,7 @@ else if(next == 'a') { /* short day name */ - dayText = getDayOfWeek(MJD); + dayText = getDayOfWeek(pnMJD); strncat(&(buf[posn]), dayText, last - posn); posn = strlen(buf); if(posn >= last) return posn; @@ -438,7 +392,7 @@ else if(next == 'A') { /* long day name */ - dayText = getLongDayOfWeek(MJD); + dayText = getLongDayOfWeek(pnMJD); strncat(&(buf[posn]), dayText, last - posn); posn = strlen(buf); if(posn >= last) return posn; @@ -462,7 +416,7 @@ else if(next == 'c') { /* Date and Time with day of week */ - dayText = getDayOfWeek(MJD); + dayText = getDayOfWeek(pnMJD); monthText = getMonth(month); if(ysign == 0) sprintf(DateTime, "%s %s %02d %02d:%02d:%02d %04d", dayText, monthText, day, hour, min, second, year ); @@ -555,7 +509,7 @@ else if(next == 'j') { /* day of year */ - int doy = getDOY(MJD, forceJulian); + getYAD(&y1, &ifleapyear, &doy, pnMJD, forceJulian); sprintf(DateTime, "%03d", doy); strncat(&(buf[posn]), DateTime, last - posn); @@ -655,7 +609,7 @@ else if(next == 's') { /* seconds since 01 Jan 1970 Gregorian */ - secsSince1970 = (int)(MJD->time_sec + (MJD->base_day - MJD_1970) * SecInDay); + secsSince1970 = (int)(pnMJD->time_sec + (pnMJD->base_day - MJD_1970) * SecInDay); sprintf(DateTime, "%d", secsSince1970); strncat(&(buf[posn]), DateTime, last - posn); @@ -681,8 +635,8 @@ else if(next == 'U') { /* week of year as a number, (00 - 53) start of week is Sunday */ - doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 4) % 7; + getYAD(&y1, &ifleapyear, &doy, pnMJD, forceJulian); + days_in_wk1 = (pnMJD->base_day - doy - 4) % 7; w = (doy + 6 - days_in_wk1) / 7; @@ -695,7 +649,7 @@ else if(next == 'u') { /* weekday as a number, 0 = Monday */ - d = 1 + (MJD->base_day - 5) % 7; + d = 1 + (pnMJD->base_day - 5) % 7; sprintf(DateTime, "%01d", d); @@ -731,8 +685,8 @@ else if(next == 'V') { /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ - int doy = getDOY(MJD, forceJulian); - int days_in_wk1 = (MJD->base_day - doy - 3) % 7; + getYAD(&y1, &ifleapyear, &doy, pnMJD, forceJulian); + int days_in_wk1 = (pnMJD->base_day - doy - 3) % 7; if(days_in_wk1 <= 3) w = (doy +6 - days_in_wk1) / 7; /* ensure first week has at least 3 days in this year */ else w = 1 + (doy + 6 - days_in_wk1) / 7; @@ -747,7 +701,7 @@ else if(next == 'w') { /* weekday as a number, 0 = Sunday */ - d = (MJD->base_day - 4) % 7; + d = (pnMJD->base_day - 4) % 7; sprintf(DateTime, "%01d", d); @@ -758,8 +712,8 @@ else if(next == 'W') { /* week of year as a number, (00 - 53) start of week is Monday */ - doy = getDOY(MJD, forceJulian); - days_in_wk1 = (MJD->base_day - doy - 3) % 7; + getYAD(&y1, &ifleapyear, &doy, pnMJD, forceJulian); + days_in_wk1 = (pnMJD->base_day - doy - 3) % 7; w = (doy +6 - days_in_wk1) / 7; @@ -772,7 +726,7 @@ else if(next == 'x') { /* date string */ - dayText = getDayOfWeek(MJD); + dayText = getDayOfWeek(pnMJD); monthText = getMonth(month); if(ysign == 0) sprintf(DateTime, "%s %s %02d, %04d", dayText, monthText, day, year ); @@ -839,7 +793,7 @@ else if(next == '+') { /* date and time */ - dayText = getDayOfWeek(MJD); + dayText = getDayOfWeek(pnMJD); monthText = getMonth(month); if(ysign == 0) sprintf(DateTime, "%s %s %02d %02d:%02d:%02d UTC %04d", dayText, monthText, day, hour, min, second, year ); Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-13 04:26:16 UTC (rev 9521) +++ trunk/lib/qsastime/qsastime.h 2009-02-13 09:45:41 UTC (rev 9522) @@ -60,6 +60,9 @@ }MJDtime; +/* internal helper function */ +void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin); +/* externally accessible functions */ QSASTIMEDLLIMPEXP int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); @@ -70,6 +73,6 @@ QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); QSASTIMEDLLIMPEXP const char * getMonth(int m); QSASTIMEDLLIMPEXP const char * getLongMonth(int m); -QSASTIMEDLLIMPEXP int getDOY(const MJDtime *MJD, int forceJulian); +QSASTIMEDLLIMPEXP void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian); #endif Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-13 04:26:16 UTC (rev 9521) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-13 09:45:41 UTC (rev 9522) @@ -41,7 +41,7 @@ double sec = 2.345678901; const char *ISOstring; double epoch; - int doy; + int doy, ifleapyear, y1; double zeroTest; size_t used; @@ -71,7 +71,7 @@ strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%S%4Z", &MJD2, 0); printf("strfMJD:ISO equiv: '%s'\n", buf); - doy = getDOY(&MJD2, 0); + getYAD(&y1, &ifleapyear, &doy, &MJD1, 0); setFromDOY(y, doy, hour, min, sec, &MJD1, 0); zeroTest = getDiffSecs(&MJD1, &MJD2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-16 19:01:47
|
Revision: 9530 http://plplot.svn.sourceforge.net/plplot/?rev=9530&view=rev Author: airwin Date: 2009-02-16 19:01:44 +0000 (Mon, 16 Feb 2009) Log Message: ----------- Split qsastime.h into a public (qsastime.h) and private (qsastimeP.h) part. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastime_test.c Added Paths: ----------- trunk/lib/qsastime/qsastimeP.h Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-16 11:21:17 UTC (rev 9529) +++ trunk/lib/qsastime/qsastime.c 2009-02-16 19:01:44 UTC (rev 9530) @@ -39,6 +39,7 @@ */ #include <ctype.h> #include "qsastime.h" +#include "qsastimeP.h" /* MJD for 0000-01-01 (correctly Jan 01, BCE 1) */ /* Julian proleptic calendar value. */ #define MJD_0000J -678943 Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-16 11:21:17 UTC (rev 9529) +++ trunk/lib/qsastime/qsastime.h 2009-02-16 19:01:44 UTC (rev 9530) @@ -60,19 +60,9 @@ }MJDtime; -/* internal helper function */ -void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin); /* externally accessible functions */ QSASTIMEDLLIMPEXP int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); -/* The following are externally accessible for now only because - the test routine calls them directly */ -QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getMonth(int m); -QSASTIMEDLLIMPEXP const char * getLongMonth(int m); -QSASTIMEDLLIMPEXP void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian); - #endif Added: trunk/lib/qsastime/qsastimeP.h =================================================================== --- trunk/lib/qsastime/qsastimeP.h (rev 0) +++ trunk/lib/qsastime/qsastimeP.h 2009-02-16 19:01:44 UTC (rev 9530) @@ -0,0 +1,15 @@ +#ifndef _QSASTIMEP_H_ +#define _QSASTIMEP_H_ +/* Declaration of private functions within libqsastime that are needed + for testing of libqsastime, but which are not normally needed for anything + else */ + +#include "qsastime.h" +QSASTIMEDLLIMPEXP void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin); +QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); +QSASTIMEDLLIMPEXP const char * getMonth(int m); +QSASTIMEDLLIMPEXP const char * getLongMonth(int m); +QSASTIMEDLLIMPEXP void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian); + +#endif Property changes on: trunk/lib/qsastime/qsastimeP.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-16 11:21:17 UTC (rev 9529) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-16 19:01:44 UTC (rev 9530) @@ -24,6 +24,7 @@ */ #include "qsastime_extra.h" +#include "qsastimeP.h" #include <time.h> #include <stdio.h> #include <stdlib.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-16 19:07:12
|
Revision: 9531 http://plplot.svn.sourceforge.net/plplot/?rev=9531&view=rev Author: airwin Date: 2009-02-16 19:07:06 +0000 (Mon, 16 Feb 2009) Log Message: ----------- Split qsastime.h into a public (qsastime.h) and private (qsastimeP.h) part. Revised test procedures that deal properly with non-integral seconds. Added tests for the case where seconds are input. This completes my planned testing of setFromUT, breakDownMJD, and strfMJD. Modified Paths: -------------- trunk/lib/qsastime/qsastime_testlib.c trunk/lib/qsastime/qsastime_testlib.out_standard Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-16 19:01:44 UTC (rev 9530) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-16 19:07:06 UTC (rev 9531) @@ -19,6 +19,7 @@ */ #include "qsastime.h" +#include "qsastimeP.h" #include <time.h> #include <stdio.h> #include <stdlib.h> @@ -90,21 +91,15 @@ } else { printf("Start of Gregorian proleptic inner test\n"); printf("input and output (strftime), and output (strfMJD) date/time\n"); - strftime(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", ptm); - printf("%s", buf); } printf("%0.4d-%02d-%02dT%02d:%02d:%018.15fZ\n", year, month+1, day, hour, min, sec); } setFromUT(year, month, day, hour, min, sec, pMJD1, forceJulian); - if(pMJD1->time_sec - (int)(pMJD1->time_sec) != 0.) { - printf("non-zero fractional part of pMJD1->time_sec value is %25.16f seconds so take early exit.\n", pMJD1->time_sec - (int)(pMJD1->time_sec)); - return 2; - } /* Inner TEST01: compare setFromUT with my_timegm. */ if(forceJulian == -1 && (inner_test_choice & TEST01)) { - secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); + secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + (int)pMJD1->time_sec); secs_past_epoch = my_timegm(ptm); delta_secs = abs(secs_past_epoch1-secs_past_epoch); if(delta_secs !=0) { @@ -116,9 +111,15 @@ } } - /* Inner TEST02: check minimal fields of strfMJD. */ + /* Inner TEST02: check minimal fields of strfMJD (Julian) or + strftime and strfMJD (Gregorian) */ if(inner_test_choice & TEST02) { - strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", pMJD1, forceJulian); + if(forceJulian == -1) { + strftime(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", ptm); + if(verbose) + printf("%s", buf); + } + strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%S%.Z\n", pMJD1, forceJulian); if(verbose) printf("%s", buf); } @@ -139,7 +140,7 @@ if(inner_test_choice & TEST03) { breakDownMJD(&year1, &month1, &day1, &hour1, &min1, &sec1, pMJD1, forceJulian); ifsamedate = (year1-year == 0 && ( ((!iffeb29 || ifleapday) && (month1-month == 0 && day1-day == 0)) || ((iffeb29 && !ifleapday) && (month1 == 2 && day1 == 1)) )); - ifsametime = (hour1-hour == 0 && min1-min ==0 && sec1-sec == 0.); + ifsametime = (hour1-hour == 0 && min1-min ==0 && fabs(sec1-sec) < 1.e-10); if(!(ifsamedate && ifsametime)) { printf("output date calculated with breakDownMJD = %d-%02d-%02dT%02d:%02d:%018.15fZ\n", year1, month1+1, day1, hour1, min1, sec1); @@ -162,6 +163,111 @@ return 0; } +int testlib_MJD(const MJDtime *MJD, int forceJulian, int inner_test_choice, int verbose) +{ + int year, month, day, hour, min; + double sec; + char buf[360]; + int year1, month1, day1, hour1, min1; + double sec1; + struct tm tm; + struct tm *ptm = &tm; + struct tm tm1; + struct tm *ptm1 = &tm1; + time_t secs_past_epoch, secs_past_epoch1, delta_secs; + + MJDtime MJD1, *pMJD1 = &MJD1; + MJDtime MJD2, *pMJD2 = &MJD2; + static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ + double jd; + int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; + if(!(forceJulian == 1 || forceJulian == -1)) { + fprintf(stderr, "testlib_MJD: invalid forceJulian value\n"); + exit(EXIT_FAILURE); + } + + normalize_MJD(pMJD1, MJD); + secs_past_epoch = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); + breakDownMJD(&year, &month, &day, &hour, &min, &sec, pMJD1, forceJulian); + + ptm->tm_year = year-1900; + ptm->tm_mon = month; + ptm->tm_mday = day; + ptm->tm_hour = hour; + ptm->tm_min = min; + ptm->tm_sec = (int) sec; + if(verbose) { + if(forceJulian == 1) { + printf("Start of Julian proleptic inner test\n"); + printf("input and output (strfMJD) date/time\n"); + } else { + printf("Start of Gregorian proleptic inner test\n"); + printf("input and output (strftime), and output (strfMJD) date/time\n"); + } + printf("%0.4d-%02d-%02dT%02d:%02d:%018.15fZ\n", year, month+1, day, hour, min, sec); + } + + /* Inner TEST01: compare breakDownMJD with gmtime. */ + if(forceJulian == -1 && (inner_test_choice & TEST01)) { + ptm1 = gmtime(&secs_past_epoch); + if(!((ptm1->tm_year+1900) == year && ptm1->tm_mon == month && ptm1->tm_mday == day && ptm1->tm_hour == hour && ptm1->tm_min == min && ptm1->tm_sec == (int)sec)) { + printf("date calculated with breakDownMJD = %d-%02d-%02dT%02d:%02d:%018.15fZ\n", year, month+1, day, hour, min, sec); + printf("date calculated with gmtime = %d-%02d-%02dT%02d:%02d:%02dZ\n", ptm1->tm_year+1900, ptm1->tm_mon+1, ptm1->tm_mday, ptm1->tm_hour, ptm1->tm_min, ptm1->tm_sec); + + printf("test failed with inconsistency between breakDownMJD and gmtime\n"); + return 1; + } + } + + /* Inner TEST02: check minimal fields of strfMJD (Julian) or + strftime and strfMJD (Gregorian) */ + if(inner_test_choice & TEST02) { + if(forceJulian == -1) { + strftime(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", ptm); + if(verbose) + printf("%s", buf); + } + strfMJD(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%S%.Z\n", pMJD1, forceJulian); + if(verbose) + printf("%s", buf); + } + + if(verbose) { + jd = 2400000.5 + pMJD1->base_day + pMJD1->time_sec/86400.; + printf("JD = %25.16f days\n", jd); + } + + if(forceJulian == 1) + ifleapyear = (year%4 == 0); + else + ifleapyear = ((year%4 == 0 && year%100 != 0) || year%400 == 0); + iffeb29 = month == 1 && day == 29; + ifleapday = (ifleapyear && iffeb29); + + /* Inner TEST03: compare breakDownMJD with its inverse, setFromUT */ + if(inner_test_choice & TEST03) { + setFromUT(year, month, day, hour, min, sec, pMJD2, forceJulian); + if(!(pMJD2->time_sec == pMJD1->time_sec && pMJD2->base_day == pMJD1->base_day)) { + printf("(normalized) input MJD components are = %d, %f\n", pMJD1->base_day, pMJD1->time_sec); + printf("(output pMJD2 components generated by setFromUT are = %d, %f\n", pMJD2->base_day, pMJD2->time_sec); + printf("test failed with inconsistency between breakDownMJD and setFromUT\n"); + return 1; + } + } + + /* Inner TEST04: compare breakDownMJD with its inverse, my_timegm */ + if(forceJulian == -1 && (inner_test_choice & TEST04)) { + secs_past_epoch1 = my_timegm(ptm); + if(!(secs_past_epoch == secs_past_epoch1)) { + printf("secs_past_epoch calculated from input = %lld\n", secs_past_epoch); + printf("secs_past_epoch calculated from my_timegm = %lld\n", secs_past_epoch1); + printf("test failed with inconsistency between my_timegm and its C library inverse gmtime"); + return 1; + } + } + return 0; +} + /* Test program to do extensive comparisons between setFromUT, breakDownMJD, and strfMJD and the closest corresponding _Linux_ C library routines, timegm, gmtime, and strftime. */ @@ -178,7 +284,7 @@ struct tm *ptm = &tm; struct tm tm1; struct tm *ptm1 = &tm1; - time_t secs_past_epoch, secs_past_epoch1, delta_secs, max_delta_secs, secs, secs1, secs2; + int seconds; MJDtime MJD1, *pMJD1 = &MJD1; static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ @@ -316,8 +422,61 @@ } if(test_choice & TEST04) { - printf("Test 04 (non-verbose) of calendar dates for every year from -5000000 to 5000000\n"); + printf("Test 04 of small second range near Year 0 (Julian)\n"); + ret= setFromUT(0, 0, 1, 0, 0, 0., pMJD1, 1); + if(ret) { + printf("Test 04 cannot even start for Year 0 (Julian)"); + return ret; + } + + for (seconds=-5; seconds < 5; seconds++) { + printf("\n"); + ret = testlib_MJD(pMJD1, 1, 0xffff, 1); + if(ret) + return ret; + pMJD1->time_sec ++; + } + + printf("Test 04 of small second range near Year 0 (Gregorian)\n"); + + + ret= setFromUT(0, 0, 1, 0, 0, 0., pMJD1, -1); + if(ret) { + printf("Test 04 cannot even start for Year 0 (Gregorian)"); + return ret; + } + + for (seconds=-5; seconds < 5; seconds++) { + printf("\n"); + ret = testlib_MJD(pMJD1, -1, 0xffff, 1); + if(ret) + return ret; + pMJD1->time_sec ++; + } + + printf("Test 04 of small second range near 2009-01-01 (Gregorian) when a leap second was inserted\n"); + + + ret= setFromUT(2009, 0, 1, 0, 0, 0.1234567890123456-5., pMJD1, -1); + if(ret) { + printf("Test 04 cannot even start for Year 0 (Gregorian)"); + return ret; + } + + for (seconds=-5; seconds < 5; seconds++) { + printf("\n"); + ret = testlib_MJD(pMJD1, -1, 0xffff, 1); + if(ret) + return ret; + pMJD1->time_sec ++; + } + + } + + if(test_choice & TEST05) { + printf("Test 05 (non-verbose) of calendar dates for every year from -5000000 to 5000000\n"); + for (date_choice=0; date_choice<5; date_choice++) { if(date_choice == 0) { month = 0; @@ -337,7 +496,7 @@ } hour = 0; min = 0; - sec = 0.; + sec = 0.123456; // test reduced range of years that just barely misses overflowing // the MJD integer. e.g., 6000000 overflows it. @@ -352,67 +511,27 @@ } } - return 0; - - max_delta_secs = 0; - ptm->tm_year = 2008-1900; - secs1 = my_timegm(ptm); - ptm->tm_year = 2010-1900; - secs2 = my_timegm(ptm); - for (secs=secs1; secs<=secs2; secs+=1) { - pMJD1->base_day = MJD_1970 + secs/86400; - pMJD1->time_sec = secs % 86400; - breakDownMJD(&year, &month, &day, &hour, &min, &sec, pMJD1, 0); - ptm = gmtime(&secs); - if(year-ptm->tm_year-1900 !=0 || month-ptm->tm_mon !=0 || day-ptm->tm_mday !=0 || hour-ptm->tm_hour !=0 || min-ptm->tm_min !=0 || ((int) sec)-ptm->tm_sec !=0) { - printf("ptm-> year+1900, month+1, day, hour, minute, sec = %d-%02d-%02dT%02d:%02d:%02dZ\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - printf("non-zero (dyear, dmonth, dday, dhour, dmin, or d (int) sec) = (%d, %d, %d, %d, %d, %d) so take early exit", year-ptm->tm_year-1900, month-ptm->tm_mon, day-ptm->tm_mday, hour-ptm->tm_hour, min-ptm->tm_min, ((int) sec)-ptm->tm_sec); - return 1; + if(test_choice & TEST06) { + printf("Test 06 (non-verbose) of all seconds from late 2007 to early 2009\n"); + ret= setFromUT(2007, 11, 30, 0, 0, 0., pMJD1, -1); + if(ret) { + printf("Test 06 cannot even start"); + return ret; } - if(sec - (int) sec !=0) { - printf("ptm-> year+1900, month+1, day, hour, minute, sec = %d-%02d-%02dT%02d:%02d:%02dZ\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - printf("non-zero fractional part of sec = %f so take early exit\n", sec - (int) sec); - return 2; - } - - if(0) { - ptm->tm_year = year-1900; - //printf("year = %d\n", year); - // Test to compare setFromUT and my_timegm results. - setFromUT(year, month, day, hour, min, sec, pMJD1, -1); - secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); - if(pMJD1->time_sec != 0.) { - printf("non-zero pMJD1->time_sec value is %25.16f seconds so take early exit.\n", pMJD1->time_sec); - return 2; + /* 430 days or ~ 37 million seconds should cover the complete next year for both Julian and Gregorian . */ + for (seconds=0; seconds < 430*86400; seconds++) { + pMJD1->time_sec = (double)seconds; + ret = testlib_MJD(pMJD1, 1, 0xffff, 0); + if(ret) + return ret; + + ret = testlib_MJD(pMJD1, -1, 0xffff, 0); + if(ret) + return ret; } - secs_past_epoch = my_timegm(ptm); - delta_secs = abs(secs_past_epoch1-secs_past_epoch); - max_delta_secs = (max_delta_secs > delta_secs ? max_delta_secs: delta_secs); - } - - if(0) { - printf("setFromUT secs_past_epoch = %lld seconds\n", secs_past_epoch1); - printf("my_timegm secs_past_epoch = %lld seconds\n", secs_past_epoch); - printf("delta secs_past_epoch = %d seconds\n", (secs_past_epoch1 - secs_past_epoch)); - strftime(&(buf[0]), 360, "strftime gives %Y-%m-%d %H:%M:%S", ptm); - printf("%s\n", buf); + } - ptm = gmtime(&secs_past_epoch); - printf("ptm-> year, month, day, hour, minute, sec = %d-%d-%d %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - - ptm->tm_mon = month; - ptm->tm_mday = day; - ptm->tm_hour = hour; - ptm->tm_min = min; - ptm->tm_sec = (int) sec; - /* next step for wide range of years loop alternative would overflow year so get out of loop this way. */ - if(year==2000000000) { - break; - } - } - } - printf("max_delta_secs = %lld\n", max_delta_secs); return 0; } Modified: trunk/lib/qsastime/qsastime_testlib.out_standard =================================================================== --- trunk/lib/qsastime/qsastime_testlib.out_standard 2009-02-16 19:01:44 UTC (rev 9530) +++ trunk/lib/qsastime/qsastime_testlib.out_standard 2009-02-16 19:07:06 UTC (rev 9531) @@ -5,2114 +5,2318 @@ Start of Julian proleptic inner test input and output (strfMJD) date/time -4717-01-01T12:00:00.000000000000000Z --4717-01-01T12:00:00Z +-4717-01-01T12:00:00.0Z setFromUT JD = -1826.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4717-01-01T12:00:00Z -4717-01-01T12:00:00.000000000000000Z -4717-01-01T12:00:00Z +-4717-01-01T12:00:00.0Z setFromUT JD = -1788.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4716-01-01T12:00:00.000000000000000Z --4716-01-01T12:00:00Z +-4716-01-01T12:00:00.0Z setFromUT JD = -1461.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4716-01-01T12:00:00Z -4716-01-01T12:00:00.000000000000000Z -4716-01-01T12:00:00Z +-4716-01-01T12:00:00.0Z setFromUT JD = -1423.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4715-01-01T12:00:00.000000000000000Z --4715-01-01T12:00:00Z +-4715-01-01T12:00:00.0Z setFromUT JD = -1095.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4715-01-01T12:00:00Z -4715-01-01T12:00:00.000000000000000Z -4715-01-01T12:00:00Z +-4715-01-01T12:00:00.0Z setFromUT JD = -1057.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4714-01-01T12:00:00.000000000000000Z --4714-01-01T12:00:00Z +-4714-01-01T12:00:00.0Z setFromUT JD = -730.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4714-01-01T12:00:00Z -4714-01-01T12:00:00.000000000000000Z -4714-01-01T12:00:00Z +-4714-01-01T12:00:00.0Z setFromUT JD = -692.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4713-01-01T12:00:00.000000000000000Z --4713-01-01T12:00:00Z +-4713-01-01T12:00:00.0Z setFromUT JD = -365.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4713-01-01T12:00:00Z -4713-01-01T12:00:00.000000000000000Z -4713-01-01T12:00:00Z +-4713-01-01T12:00:00.0Z setFromUT JD = -327.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4712-01-01T12:00:00.000000000000000Z --4712-01-01T12:00:00Z +-4712-01-01T12:00:00.0Z setFromUT JD = 0.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4712-01-01T12:00:00Z -4712-01-01T12:00:00.000000000000000Z -4712-01-01T12:00:00Z +-4712-01-01T12:00:00.0Z setFromUT JD = 38.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4711-01-01T12:00:00.000000000000000Z --4711-01-01T12:00:00Z +-4711-01-01T12:00:00.0Z setFromUT JD = 366.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4711-01-01T12:00:00Z -4711-01-01T12:00:00.000000000000000Z -4711-01-01T12:00:00Z +-4711-01-01T12:00:00.0Z setFromUT JD = 404.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4710-01-01T12:00:00.000000000000000Z --4710-01-01T12:00:00Z +-4710-01-01T12:00:00.0Z setFromUT JD = 731.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4710-01-01T12:00:00Z -4710-01-01T12:00:00.000000000000000Z -4710-01-01T12:00:00Z +-4710-01-01T12:00:00.0Z setFromUT JD = 769.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4709-01-01T12:00:00.000000000000000Z --4709-01-01T12:00:00Z +-4709-01-01T12:00:00.0Z setFromUT JD = 1096.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4709-01-01T12:00:00Z -4709-01-01T12:00:00.000000000000000Z -4709-01-01T12:00:00Z +-4709-01-01T12:00:00.0Z setFromUT JD = 1134.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4708-01-01T12:00:00.000000000000000Z --4708-01-01T12:00:00Z +-4708-01-01T12:00:00.0Z setFromUT JD = 1461.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4708-01-01T12:00:00Z -4708-01-01T12:00:00.000000000000000Z -4708-01-01T12:00:00Z +-4708-01-01T12:00:00.0Z setFromUT JD = 1499.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4707-01-01T12:00:00.000000000000000Z --4707-01-01T12:00:00Z +-4707-01-01T12:00:00.0Z setFromUT JD = 1827.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4707-01-01T12:00:00Z -4707-01-01T12:00:00.000000000000000Z -4707-01-01T12:00:00Z +-4707-01-01T12:00:00.0Z setFromUT JD = 1865.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4717-02-28T12:00:00.000000000000000Z --4717-02-28T12:00:00Z +-4717-02-28T12:00:00.0Z setFromUT JD = -1768.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4717-02-28T12:00:00Z -4717-02-28T12:00:00.000000000000000Z -4717-02-28T12:00:00Z +-4717-02-28T12:00:00.0Z setFromUT JD = -1730.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4716-02-28T12:00:00.000000000000000Z --4716-02-28T12:00:00Z +-4716-02-28T12:00:00.0Z setFromUT JD = -1403.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4716-02-28T12:00:00Z -4716-02-28T12:00:00.000000000000000Z -4716-02-28T12:00:00Z +-4716-02-28T12:00:00.0Z setFromUT JD = -1365.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4715-02-28T12:00:00.000000000000000Z --4715-02-28T12:00:00Z +-4715-02-28T12:00:00.0Z setFromUT JD = -1037.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4715-02-28T12:00:00Z -4715-02-28T12:00:00.000000000000000Z -4715-02-28T12:00:00Z +-4715-02-28T12:00:00.0Z setFromUT JD = -999.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4714-02-28T12:00:00.000000000000000Z --4714-02-28T12:00:00Z +-4714-02-28T12:00:00.0Z setFromUT JD = -672.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4714-02-28T12:00:00Z -4714-02-28T12:00:00.000000000000000Z -4714-02-28T12:00:00Z +-4714-02-28T12:00:00.0Z setFromUT JD = -634.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4713-02-28T12:00:00.000000000000000Z --4713-02-28T12:00:00Z +-4713-02-28T12:00:00.0Z setFromUT JD = -307.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4713-02-28T12:00:00Z -4713-02-28T12:00:00.000000000000000Z -4713-02-28T12:00:00Z +-4713-02-28T12:00:00.0Z setFromUT JD = -269.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4712-02-28T12:00:00.000000000000000Z --4712-02-28T12:00:00Z +-4712-02-28T12:00:00.0Z setFromUT JD = 58.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4712-02-28T12:00:00Z -4712-02-28T12:00:00.000000000000000Z -4712-02-28T12:00:00Z +-4712-02-28T12:00:00.0Z setFromUT JD = 96.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4711-02-28T12:00:00.000000000000000Z --4711-02-28T12:00:00Z +-4711-02-28T12:00:00.0Z setFromUT JD = 424.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4711-02-28T12:00:00Z -4711-02-28T12:00:00.000000000000000Z -4711-02-28T12:00:00Z +-4711-02-28T12:00:00.0Z setFromUT JD = 462.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4710-02-28T12:00:00.000000000000000Z --4710-02-28T12:00:00Z +-4710-02-28T12:00:00.0Z setFromUT JD = 789.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4710-02-28T12:00:00Z -4710-02-28T12:00:00.000000000000000Z -4710-02-28T12:00:00Z +-4710-02-28T12:00:00.0Z setFromUT JD = 827.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4709-02-28T12:00:00.000000000000000Z --4709-02-28T12:00:00Z +-4709-02-28T12:00:00.0Z setFromUT JD = 1154.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4709-02-28T12:00:00Z -4709-02-28T12:00:00.000000000000000Z -4709-02-28T12:00:00Z +-4709-02-28T12:00:00.0Z setFromUT JD = 1192.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4708-02-28T12:00:00.000000000000000Z --4708-02-28T12:00:00Z +-4708-02-28T12:00:00.0Z setFromUT JD = 1519.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4708-02-28T12:00:00Z -4708-02-28T12:00:00.000000000000000Z -4708-02-28T12:00:00Z +-4708-02-28T12:00:00.0Z setFromUT JD = 1557.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4707-02-28T12:00:00.000000000000000Z --4707-02-28T12:00:00Z +-4707-02-28T12:00:00.0Z setFromUT JD = 1885.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4707-02-28T12:00:00Z -4707-02-28T12:00:00.000000000000000Z -4707-02-28T12:00:00Z +-4707-02-28T12:00:00.0Z setFromUT JD = 1923.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4717-02-29T12:00:00.000000000000000Z --4717-03-01T12:00:00Z +-4717-03-01T12:00:00.0Z setFromUT JD = -1767.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4717-02-29T12:00:00Z -4717-02-29T12:00:00.000000000000000Z -4717-03-01T12:00:00Z +-4717-03-01T12:00:00.0Z setFromUT JD = -1729.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4716-02-29T12:00:00.000000000000000Z --4716-02-29T12:00:00Z +-4716-02-29T12:00:00.0Z setFromUT JD = -1402.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4716-02-29T12:00:00Z -4716-02-29T12:00:00.000000000000000Z -4716-02-29T12:00:00Z +-4716-02-29T12:00:00.0Z setFromUT JD = -1364.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4715-02-29T12:00:00.000000000000000Z --4715-03-01T12:00:00Z +-4715-03-01T12:00:00.0Z setFromUT JD = -1036.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4715-02-29T12:00:00Z -4715-02-29T12:00:00.000000000000000Z -4715-03-01T12:00:00Z +-4715-03-01T12:00:00.0Z setFromUT JD = -998.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4714-02-29T12:00:00.000000000000000Z --4714-03-01T12:00:00Z +-4714-03-01T12:00:00.0Z setFromUT JD = -671.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4714-02-29T12:00:00Z -4714-02-29T12:00:00.000000000000000Z -4714-03-01T12:00:00Z +-4714-03-01T12:00:00.0Z setFromUT JD = -633.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4713-02-29T12:00:00.000000000000000Z --4713-03-01T12:00:00Z +-4713-03-01T12:00:00.0Z setFromUT JD = -306.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4713-02-29T12:00:00Z -4713-02-29T12:00:00.000000000000000Z -4713-03-01T12:00:00Z +-4713-03-01T12:00:00.0Z setFromUT JD = -268.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4712-02-29T12:00:00.000000000000000Z --4712-02-29T12:00:00Z +-4712-02-29T12:00:00.0Z setFromUT JD = 59.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4712-02-29T12:00:00Z -4712-02-29T12:00:00.000000000000000Z -4712-02-29T12:00:00Z +-4712-02-29T12:00:00.0Z setFromUT JD = 97.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4711-02-29T12:00:00.000000000000000Z --4711-03-01T12:00:00Z +-4711-03-01T12:00:00.0Z setFromUT JD = 425.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4711-02-29T12:00:00Z -4711-02-29T12:00:00.000000000000000Z -4711-03-01T12:00:00Z +-4711-03-01T12:00:00.0Z setFromUT JD = 463.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4710-02-29T12:00:00.000000000000000Z --4710-03-01T12:00:00Z +-4710-03-01T12:00:00.0Z setFromUT JD = 790.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4710-02-29T12:00:00Z -4710-02-29T12:00:00.000000000000000Z -4710-03-01T12:00:00Z +-4710-03-01T12:00:00.0Z setFromUT JD = 828.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4709-02-29T12:00:00.000000000000000Z --4709-03-01T12:00:00Z +-4709-03-01T12:00:00.0Z setFromUT JD = 1155.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4709-02-29T12:00:00Z -4709-02-29T12:00:00.000000000000000Z -4709-03-01T12:00:00Z +-4709-03-01T12:00:00.0Z setFromUT JD = 1193.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4708-02-29T12:00:00.000000000000000Z --4708-02-29T12:00:00Z +-4708-02-29T12:00:00.0Z setFromUT JD = 1520.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4708-02-29T12:00:00Z -4708-02-29T12:00:00.000000000000000Z -4708-02-29T12:00:00Z +-4708-02-29T12:00:00.0Z setFromUT JD = 1558.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4707-02-29T12:00:00.000000000000000Z --4707-03-01T12:00:00Z +-4707-03-01T12:00:00.0Z setFromUT JD = 1886.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4707-02-29T12:00:00Z -4707-02-29T12:00:00.000000000000000Z -4707-03-01T12:00:00Z +-4707-03-01T12:00:00.0Z setFromUT JD = 1924.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4717-03-01T12:00:00.000000000000000Z --4717-03-01T12:00:00Z +-4717-03-01T12:00:00.0Z setFromUT JD = -1767.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4717-03-01T12:00:00Z -4717-03-01T12:00:00.000000000000000Z -4717-03-01T12:00:00Z +-4717-03-01T12:00:00.0Z setFromUT JD = -1729.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4716-03-01T12:00:00.000000000000000Z --4716-03-01T12:00:00Z +-4716-03-01T12:00:00.0Z setFromUT JD = -1401.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4716-03-01T12:00:00Z -4716-03-01T12:00:00.000000000000000Z -4716-03-01T12:00:00Z +-4716-03-01T12:00:00.0Z setFromUT JD = -1363.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4715-03-01T12:00:00.000000000000000Z --4715-03-01T12:00:00Z +-4715-03-01T12:00:00.0Z setFromUT JD = -1036.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4715-03-01T12:00:00Z -4715-03-01T12:00:00.000000000000000Z -4715-03-01T12:00:00Z +-4715-03-01T12:00:00.0Z setFromUT JD = -998.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4714-03-01T12:00:00.000000000000000Z --4714-03-01T12:00:00Z +-4714-03-01T12:00:00.0Z setFromUT JD = -671.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4714-03-01T12:00:00Z -4714-03-01T12:00:00.000000000000000Z -4714-03-01T12:00:00Z +-4714-03-01T12:00:00.0Z setFromUT JD = -633.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4713-03-01T12:00:00.000000000000000Z --4713-03-01T12:00:00Z +-4713-03-01T12:00:00.0Z setFromUT JD = -306.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4713-03-01T12:00:00Z -4713-03-01T12:00:00.000000000000000Z -4713-03-01T12:00:00Z +-4713-03-01T12:00:00.0Z setFromUT JD = -268.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4712-03-01T12:00:00.000000000000000Z --4712-03-01T12:00:00Z +-4712-03-01T12:00:00.0Z setFromUT JD = 60.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4712-03-01T12:00:00Z -4712-03-01T12:00:00.000000000000000Z -4712-03-01T12:00:00Z +-4712-03-01T12:00:00.0Z setFromUT JD = 98.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4711-03-01T12:00:00.000000000000000Z --4711-03-01T12:00:00Z +-4711-03-01T12:00:00.0Z setFromUT JD = 425.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4711-03-01T12:00:00Z -4711-03-01T12:00:00.000000000000000Z -4711-03-01T12:00:00Z +-4711-03-01T12:00:00.0Z setFromUT JD = 463.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4710-03-01T12:00:00.000000000000000Z --4710-03-01T12:00:00Z +-4710-03-01T12:00:00.0Z setFromUT JD = 790.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4710-03-01T12:00:00Z -4710-03-01T12:00:00.000000000000000Z -4710-03-01T12:00:00Z +-4710-03-01T12:00:00.0Z setFromUT JD = 828.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4709-03-01T12:00:00.000000000000000Z --4709-03-01T12:00:00Z +-4709-03-01T12:00:00.0Z setFromUT JD = 1155.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4709-03-01T12:00:00Z -4709-03-01T12:00:00.000000000000000Z -4709-03-01T12:00:00Z +-4709-03-01T12:00:00.0Z setFromUT JD = 1193.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4708-03-01T12:00:00.000000000000000Z --4708-03-01T12:00:00Z +-4708-03-01T12:00:00.0Z setFromUT JD = 1521.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4708-03-01T12:00:00Z -4708-03-01T12:00:00.000000000000000Z -4708-03-01T12:00:00Z +-4708-03-01T12:00:00.0Z setFromUT JD = 1559.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4707-03-01T12:00:00.000000000000000Z --4707-03-01T12:00:00Z +-4707-03-01T12:00:00.0Z setFromUT JD = 1886.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4707-03-01T12:00:00Z -4707-03-01T12:00:00.000000000000000Z -4707-03-01T12:00:00Z +-4707-03-01T12:00:00.0Z setFromUT JD = 1924.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4717-12-31T12:00:00.000000000000000Z --4717-12-31T12:00:00Z +-4717-12-31T12:00:00.0Z setFromUT JD = -1462.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4717-12-31T12:00:00Z -4717-12-31T12:00:00.000000000000000Z -4717-12-31T12:00:00Z +-4717-12-31T12:00:00.0Z setFromUT JD = -1424.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4716-12-31T12:00:00.000000000000000Z --4716-12-31T12:00:00Z +-4716-12-31T12:00:00.0Z setFromUT JD = -1096.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4716-12-31T12:00:00Z -4716-12-31T12:00:00.000000000000000Z -4716-12-31T12:00:00Z +-4716-12-31T12:00:00.0Z setFromUT JD = -1058.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4715-12-31T12:00:00.000000000000000Z --4715-12-31T12:00:00Z +-4715-12-31T12:00:00.0Z setFromUT JD = -731.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4715-12-31T12:00:00Z -4715-12-31T12:00:00.000000000000000Z -4715-12-31T12:00:00Z +-4715-12-31T12:00:00.0Z setFromUT JD = -693.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4714-12-31T12:00:00.000000000000000Z --4714-12-31T12:00:00Z +-4714-12-31T12:00:00.0Z setFromUT JD = -366.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4714-12-31T12:00:00Z -4714-12-31T12:00:00.000000000000000Z -4714-12-31T12:00:00Z +-4714-12-31T12:00:00.0Z setFromUT JD = -328.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4713-12-31T12:00:00.000000000000000Z --4713-12-31T12:00:00Z +-4713-12-31T12:00:00.0Z setFromUT JD = -1.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4713-12-31T12:00:00Z -4713-12-31T12:00:00.000000000000000Z -4713-12-31T12:00:00Z +-4713-12-31T12:00:00.0Z setFromUT JD = 37.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4712-12-31T12:00:00.000000000000000Z --4712-12-31T12:00:00Z +-4712-12-31T12:00:00.0Z setFromUT JD = 365.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4712-12-31T12:00:00Z -4712-12-31T12:00:00.000000000000000Z -4712-12-31T12:00:00Z +-4712-12-31T12:00:00.0Z setFromUT JD = 403.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4711-12-31T12:00:00.000000000000000Z --4711-12-31T12:00:00Z +-4711-12-31T12:00:00.0Z setFromUT JD = 730.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4711-12-31T12:00:00Z -4711-12-31T12:00:00.000000000000000Z -4711-12-31T12:00:00Z +-4711-12-31T12:00:00.0Z setFromUT JD = 768.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4710-12-31T12:00:00.000000000000000Z --4710-12-31T12:00:00Z +-4710-12-31T12:00:00.0Z setFromUT JD = 1095.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4710-12-31T12:00:00Z -4710-12-31T12:00:00.000000000000000Z -4710-12-31T12:00:00Z +-4710-12-31T12:00:00.0Z setFromUT JD = 1133.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4709-12-31T12:00:00.000000000000000Z --4709-12-31T12:00:00Z +-4709-12-31T12:00:00.0Z setFromUT JD = 1460.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4709-12-31T12:00:00Z -4709-12-31T12:00:00.000000000000000Z -4709-12-31T12:00:00Z +-4709-12-31T12:00:00.0Z setFromUT JD = 1498.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4708-12-31T12:00:00.000000000000000Z --4708-12-31T12:00:00Z +-4708-12-31T12:00:00.0Z setFromUT JD = 1826.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4708-12-31T12:00:00Z -4708-12-31T12:00:00.000000000000000Z -4708-12-31T12:00:00Z +-4708-12-31T12:00:00.0Z setFromUT JD = 1864.0000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -4707-12-31T12:00:00.000000000000000Z --4707-12-31T12:00:00Z +-4707-12-31T12:00:00.0Z setFromUT JD = 2191.0000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --4707-12-31T12:00:00Z -4707-12-31T12:00:00.000000000000000Z -4707-12-31T12:00:00Z +-4707-12-31T12:00:00.0Z setFromUT JD = 2229.0000000000000000 days Test 02 of calendar dates in the vicinity of the year epoch. Start of Julian proleptic inner test input and output (strfMJD) date/time -0005-01-01T00:00:00.000000000000000Z --0005-01-01T00:00:00Z +-0005-01-01T00:00:00.0Z setFromUT JD = 1719231.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0005-01-01T00:00:00.000000000000000Z -5-01-01T00:00:00Z --0005-01-01T00:00:00.000000000000000Z --0005-01-01T00:00:00Z +-0005-01-01T00:00:00.0Z setFromUT JD = 1719233.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0004-01-01T00:00:00.000000000000000Z --0004-01-01T00:00:00Z +-0004-01-01T00:00:00.0Z setFromUT JD = 1719596.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0004-01-01T00:00:00.000000000000000Z -4-01-01T00:00:00Z --0004-01-01T00:00:00.000000000000000Z --0004-01-01T00:00:00Z +-0004-01-01T00:00:00.0Z setFromUT JD = 1719598.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0003-01-01T00:00:00.000000000000000Z --0003-01-01T00:00:00Z +-0003-01-01T00:00:00.0Z setFromUT JD = 1719962.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0003-01-01T00:00:00.000000000000000Z -3-01-01T00:00:00Z --0003-01-01T00:00:00.000000000000000Z --0003-01-01T00:00:00Z +-0003-01-01T00:00:00.0Z setFromUT JD = 1719964.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0002-01-01T00:00:00.000000000000000Z --0002-01-01T00:00:00Z +-0002-01-01T00:00:00.0Z setFromUT JD = 1720327.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0002-01-01T00:00:00.000000000000000Z -2-01-01T00:00:00Z --0002-01-01T00:00:00.000000000000000Z --0002-01-01T00:00:00Z +-0002-01-01T00:00:00.0Z setFromUT JD = 1720329.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0001-01-01T00:00:00.000000000000000Z --0001-01-01T00:00:00Z +-0001-01-01T00:00:00.0Z setFromUT JD = 1720692.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0001-01-01T00:00:00.000000000000000Z -1-01-01T00:00:00Z --0001-01-01T00:00:00.000000000000000Z --0001-01-01T00:00:00Z +-0001-01-01T00:00:00.0Z setFromUT JD = 1720694.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0000-01-01T00:00:00.000000000000000Z -0000-01-01T00:00:00Z +0000-01-01T00:00:00.0Z setFromUT JD = 1721057.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0000-01-01T00:00:00.000000000000000Z 0-01-01T00:00:00Z -0000-01-01T00:00:00.000000000000000Z -0000-01-01T00:00:00Z +0000-01-01T00:00:00.0Z setFromUT JD = 1721059.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0001-01-01T00:00:00.000000000000000Z -0001-01-01T00:00:00Z +0001-01-01T00:00:00.0Z setFromUT JD = 1721423.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0001-01-01T00:00:00.000000000000000Z 1-01-01T00:00:00Z -0001-01-01T00:00:00.000000000000000Z -0001-01-01T00:00:00Z +0001-01-01T00:00:00.0Z setFromUT JD = 1721425.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0002-01-01T00:00:00.000000000000000Z -0002-01-01T00:00:00Z +0002-01-01T00:00:00.0Z setFromUT JD = 1721788.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0002-01-01T00:00:00.000000000000000Z 2-01-01T00:00:00Z -0002-01-01T00:00:00.000000000000000Z -0002-01-01T00:00:00Z +0002-01-01T00:00:00.0Z setFromUT JD = 1721790.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0003-01-01T00:00:00.000000000000000Z -0003-01-01T00:00:00Z +0003-01-01T00:00:00.0Z setFromUT JD = 1722153.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0003-01-01T00:00:00.000000000000000Z 3-01-01T00:00:00Z -0003-01-01T00:00:00.000000000000000Z -0003-01-01T00:00:00Z +0003-01-01T00:00:00.0Z setFromUT JD = 1722155.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0004-01-01T00:00:00.000000000000000Z -0004-01-01T00:00:00Z +0004-01-01T00:00:00.0Z setFromUT JD = 1722518.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0004-01-01T00:00:00.000000000000000Z 4-01-01T00:00:00Z -0004-01-01T00:00:00.000000000000000Z -0004-01-01T00:00:00Z +0004-01-01T00:00:00.0Z setFromUT JD = 1722520.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0005-01-01T00:00:00.000000000000000Z -0005-01-01T00:00:00Z +0005-01-01T00:00:00.0Z setFromUT JD = 1722884.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0005-01-01T00:00:00.000000000000000Z 5-01-01T00:00:00Z -0005-01-01T00:00:00.000000000000000Z -0005-01-01T00:00:00Z +0005-01-01T00:00:00.0Z setFromUT JD = 1722886.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0005-02-28T00:00:00.000000000000000Z --0005-02-28T00:00:00Z +-0005-02-28T00:00:00.0Z setFromUT JD = 1719289.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0005-02-28T00:00:00.000000000000000Z -5-02-28T00:00:00Z --0005-02-28T00:00:00.000000000000000Z --0005-02-28T00:00:00Z +-0005-02-28T00:00:00.0Z setFromUT JD = 1719291.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0004-02-28T00:00:00.000000000000000Z --0004-02-28T00:00:00Z +-0004-02-28T00:00:00.0Z setFromUT JD = 1719654.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0004-02-28T00:00:00.000000000000000Z -4-02-28T00:00:00Z --0004-02-28T00:00:00.000000000000000Z --0004-02-28T00:00:00Z +-0004-02-28T00:00:00.0Z setFromUT JD = 1719656.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0003-02-28T00:00:00.000000000000000Z --0003-02-28T00:00:00Z +-0003-02-28T00:00:00.0Z setFromUT JD = 1720020.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0003-02-28T00:00:00.000000000000000Z -3-02-28T00:00:00Z --0003-02-28T00:00:00.000000000000000Z --0003-02-28T00:00:00Z +-0003-02-28T00:00:00.0Z setFromUT JD = 1720022.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0002-02-28T00:00:00.000000000000000Z --0002-02-28T00:00:00Z +-0002-02-28T00:00:00.0Z setFromUT JD = 1720385.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0002-02-28T00:00:00.000000000000000Z -2-02-28T00:00:00Z --0002-02-28T00:00:00.000000000000000Z --0002-02-28T00:00:00Z +-0002-02-28T00:00:00.0Z setFromUT JD = 1720387.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0001-02-28T00:00:00.000000000000000Z --0001-02-28T00:00:00Z +-0001-02-28T00:00:00.0Z setFromUT JD = 1720750.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0001-02-28T00:00:00.000000000000000Z -1-02-28T00:00:00Z --0001-02-28T00:00:00.000000000000000Z --0001-02-28T00:00:00Z +-0001-02-28T00:00:00.0Z setFromUT JD = 1720752.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0000-02-28T00:00:00.000000000000000Z -0000-02-28T00:00:00Z +0000-02-28T00:00:00.0Z setFromUT JD = 1721115.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0000-02-28T00:00:00.000000000000000Z 0-02-28T00:00:00Z -0000-02-28T00:00:00.000000000000000Z -0000-02-28T00:00:00Z +0000-02-28T00:00:00.0Z setFromUT JD = 1721117.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0001-02-28T00:00:00.000000000000000Z -0001-02-28T00:00:00Z +0001-02-28T00:00:00.0Z setFromUT JD = 1721481.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0001-02-28T00:00:00.000000000000000Z 1-02-28T00:00:00Z -0001-02-28T00:00:00.000000000000000Z -0001-02-28T00:00:00Z +0001-02-28T00:00:00.0Z setFromUT JD = 1721483.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0002-02-28T00:00:00.000000000000000Z -0002-02-28T00:00:00Z +0002-02-28T00:00:00.0Z setFromUT JD = 1721846.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0002-02-28T00:00:00.000000000000000Z 2-02-28T00:00:00Z -0002-02-28T00:00:00.000000000000000Z -0002-02-28T00:00:00Z +0002-02-28T00:00:00.0Z setFromUT JD = 1721848.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0003-02-28T00:00:00.000000000000000Z -0003-02-28T00:00:00Z +0003-02-28T00:00:00.0Z setFromUT JD = 1722211.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0003-02-28T00:00:00.000000000000000Z 3-02-28T00:00:00Z -0003-02-28T00:00:00.000000000000000Z -0003-02-28T00:00:00Z +0003-02-28T00:00:00.0Z setFromUT JD = 1722213.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0004-02-28T00:00:00.000000000000000Z -0004-02-28T00:00:00Z +0004-02-28T00:00:00.0Z setFromUT JD = 1722576.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0004-02-28T00:00:00.000000000000000Z 4-02-28T00:00:00Z -0004-02-28T00:00:00.000000000000000Z -0004-02-28T00:00:00Z +0004-02-28T00:00:00.0Z setFromUT JD = 1722578.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0005-02-28T00:00:00.000000000000000Z -0005-02-28T00:00:00Z +0005-02-28T00:00:00.0Z setFromUT JD = 1722942.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0005-02-28T00:00:00.000000000000000Z 5-02-28T00:00:00Z -0005-02-28T00:00:00.000000000000000Z -0005-02-28T00:00:00Z +0005-02-28T00:00:00.0Z setFromUT JD = 1722944.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0005-02-29T00:00:00.000000000000000Z --0005-03-01T00:00:00Z +-0005-03-01T00:00:00.0Z setFromUT JD = 1719290.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --5-02-29T00:00:00Z -0005-02-29T00:00:00.000000000000000Z --0005-03-01T00:00:00Z +-5-03-01T00:00:00Z +-0005-03-01T00:00:00.0Z setFromUT JD = 1719292.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0004-02-29T00:00:00.000000000000000Z --0004-02-29T00:00:00Z +-0004-02-29T00:00:00.0Z setFromUT JD = 1719655.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0004-02-29T00:00:00.000000000000000Z -4-02-29T00:00:00Z --0004-02-29T00:00:00.000000000000000Z --0004-02-29T00:00:00Z +-0004-02-29T00:00:00.0Z setFromUT JD = 1719657.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0003-02-29T00:00:00.000000000000000Z --0003-03-01T00:00:00Z +-0003-03-01T00:00:00.0Z setFromUT JD = 1720021.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --3-02-29T00:00:00Z -0003-02-29T00:00:00.000000000000000Z --0003-03-01T00:00:00Z +-3-03-01T00:00:00Z +-0003-03-01T00:00:00.0Z setFromUT JD = 1720023.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0002-02-29T00:00:00.000000000000000Z --0002-03-01T00:00:00Z +-0002-03-01T00:00:00.0Z setFromUT JD = 1720386.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --2-02-29T00:00:00Z -0002-02-29T00:00:00.000000000000000Z --0002-03-01T00:00:00Z +-2-03-01T00:00:00Z +-0002-03-01T00:00:00.0Z setFromUT JD = 1720388.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0001-02-29T00:00:00.000000000000000Z --0001-03-01T00:00:00Z +-0001-03-01T00:00:00.0Z setFromUT JD = 1720751.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time --1-02-29T00:00:00Z -0001-02-29T00:00:00.000000000000000Z --0001-03-01T00:00:00Z +-1-03-01T00:00:00Z +-0001-03-01T00:00:00.0Z setFromUT JD = 1720753.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0000-02-29T00:00:00.000000000000000Z -0000-02-29T00:00:00Z +0000-02-29T00:00:00.0Z setFromUT JD = 1721116.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0000-02-29T00:00:00.000000000000000Z 0-02-29T00:00:00Z -0000-02-29T00:00:00.000000000000000Z -0000-02-29T00:00:00Z +0000-02-29T00:00:00.0Z setFromUT JD = 1721118.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0001-02-29T00:00:00.000000000000000Z -0001-03-01T00:00:00Z +0001-03-01T00:00:00.0Z setFromUT JD = 1721482.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time -1-02-29T00:00:00Z 0001-02-29T00:00:00.000000000000000Z -0001-03-01T00:00:00Z +1-03-01T00:00:00Z +0001-03-01T00:00:00.0Z setFromUT JD = 1721484.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0002-02-29T00:00:00.000000000000000Z -0002-03-01T00:00:00Z +0002-03-01T00:00:00.0Z setFromUT JD = 1721847.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time -2-02-29T00:00:00Z 0002-02-29T00:00:00.000000000000000Z -0002-03-01T00:00:00Z +2-03-01T00:00:00Z +0002-03-01T00:00:00.0Z setFromUT JD = 1721849.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0003-02-29T00:00:00.000000000000000Z -0003-03-01T00:00:00Z +0003-03-01T00:00:00.0Z setFromUT JD = 1722212.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time -3-02-29T00:00:00Z 0003-02-29T00:00:00.000000000000000Z -0003-03-01T00:00:00Z +3-03-01T00:00:00Z +0003-03-01T00:00:00.0Z setFromUT JD = 1722214.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0004-02-29T00:00:00.000000000000000Z -0004-02-29T00:00:00Z +0004-02-29T00:00:00.0Z setFromUT JD = 1722577.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0004-02-29T00:00:00.000000000000000Z 4-02-29T00:00:00Z -0004-02-29T00:00:00.000000000000000Z -0004-02-29T00:00:00Z +0004-02-29T00:00:00.0Z setFromUT JD = 1722579.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0005-02-29T00:00:00.000000000000000Z -0005-03-01T00:00:00Z +0005-03-01T00:00:00.0Z setFromUT JD = 1722943.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time -5-02-29T00:00:00Z 0005-02-29T00:00:00.000000000000000Z -0005-03-01T00:00:00Z +5-03-01T00:00:00Z +0005-03-01T00:00:00.0Z setFromUT JD = 1722945.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0005-03-01T00:00:00.000000000000000Z --0005-03-01T00:00:00Z +-0005-03-01T00:00:00.0Z setFromUT JD = 1719290.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0005-03-01T00:00:00.000000000000000Z -5-03-01T00:00:00Z --0005-03-01T00:00:00.000000000000000Z --0005-03-01T00:00:00Z +-0005-03-01T00:00:00.0Z setFromUT JD = 1719292.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0004-03-01T00:00:00.000000000000000Z --0004-03-01T00:00:00Z +-0004-03-01T00:00:00.0Z setFromUT JD = 1719656.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0004-03-01T00:00:00.000000000000000Z -4-03-01T00:00:00Z --0004-03-01T00:00:00.000000000000000Z --0004-03-01T00:00:00Z +-0004-03-01T00:00:00.0Z setFromUT JD = 1719658.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0003-03-01T00:00:00.000000000000000Z --0003-03-01T00:00:00Z +-0003-03-01T00:00:00.0Z setFromUT JD = 1720021.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0003-03-01T00:00:00.000000000000000Z -3-03-01T00:00:00Z --0003-03-01T00:00:00.000000000000000Z --0003-03-01T00:00:00Z +-0003-03-01T00:00:00.0Z setFromUT JD = 1720023.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0002-03-01T00:00:00.000000000000000Z --0002-03-01T00:00:00Z +-0002-03-01T00:00:00.0Z setFromUT JD = 1720386.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0002-03-01T00:00:00.000000000000000Z -2-03-01T00:00:00Z --0002-03-01T00:00:00.000000000000000Z --0002-03-01T00:00:00Z +-0002-03-01T00:00:00.0Z setFromUT JD = 1720388.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time -0001-03-01T00:00:00.000000000000000Z --0001-03-01T00:00:00Z +-0001-03-01T00:00:00.0Z setFromUT JD = 1720751.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +-0001-03-01T00:00:00.000000000000000Z -1-03-01T00:00:00Z --0001-03-01T00:00:00.000000000000000Z --0001-03-01T00:00:00Z +-0001-03-01T00:00:00.0Z setFromUT JD = 1720753.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0000-03-01T00:00:00.000000000000000Z -0000-03-01T00:00:00Z +0000-03-01T00:00:00.0Z setFromUT JD = 1721117.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0000-03-01T00:00:00.000000000000000Z 0-03-01T00:00:00Z -0000-03-01T00:00:00.000000000000000Z -0000-03-01T00:00:00Z +0000-03-01T00:00:00.0Z setFromUT JD = 1721119.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0001-03-01T00:00:00.000000000000000Z -0001-03-01T00:00:00Z +0001-03-01T00:00:00.0Z setFromUT JD = 1721482.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0001-03-01T00:00:00.000000000000000Z 1-03-01T00:00:00Z -0001-03-01T00:00:00.000000000000000Z -0001-03-01T00:00:00Z +0001-03-01T00:00:00.0Z setFromUT JD = 1721484.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0002-03-01T00:00:00.000000000000000Z -0002-03-01T00:00:00Z +0002-03-01T00:00:00.0Z setFromUT JD = 1721847.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0002-03-01T00:00:00.000000000000000Z 2-03-01T00:00:00Z -0002-03-01T00:00:00.000000000000000Z -0002-03-01T00:00:00Z +0002-03-01T00:00:00.0Z setFromUT JD = 1721849.5000000000000000 days Start of Julian proleptic inner test input and output (strfMJD) date/time 0003-03-01T00:00:00.000000000000000Z -0003-03-01T00:00:00Z +0003-03-01T00:00:00.0Z setFromUT JD = 1722212.5000000000000000 days Start of Gregorian proleptic inner test input and output (strftime), and output (strfMJD) date/time +0003-03-01T00:00:00.000000000000000Z 3-03-01T00:00:00Z -0003-03-01T00:00:00.000000000000000Z -0003-03-01T00:00:00Z +0003-03-01T00:00:00.0Z ... [truncated message content] |
From: <ai...@us...> - 2009-02-18 06:55:33
|
Revision: 9545 http://plplot.svn.sourceforge.net/plplot/?rev=9545&view=rev Author: airwin Date: 2009-02-18 06:55:30 +0000 (Wed, 18 Feb 2009) Log Message: ----------- Make all internal helper functions invisible for libqsastime. This requires reordering qsastime so all the public API functions that wrap the internal functions are defined last, dropping the #include of qsastimeP.h, dropping the visibility attributes from qsastimeP.h, and redoing the build rules so that qsastime_test and qsastime_testlib (both of which test the internal invisible functions of libqsastime) use the library code, but not the library itself. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastimeP.h Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-18 06:31:14 UTC (rev 9544) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-18 06:55:30 UTC (rev 9545) @@ -59,18 +59,23 @@ # qsastime_extra.[ch] provides helper functions for qsastime_test that should # not be part of the library. +# Add in qsastime.c rather than use the library because don't want +# to make private library API visible. -add_executable(qsastime_test qsastime_test.c qsastime_extra.c) -target_link_libraries(qsastime_test qsastime) +add_executable(qsastime_test qsastime_test.c qsastime_extra.c qsastime.c) # Routine for testing just the library functions against their library # inverses (to test self-consistency when such inverses exist) and also # equivalent C library routines. -# N.B. the routine immediately errors out if sizeof(time_t) < 8 or +# N.B. the routine immediately errors out at run time if sizeof(time_t) < 8 or # sizeof(int) !=4. The time_t constraint is because we want access to a large # C library date range to do the tests. The int constraint is so we # emulate library results on 32-bit systems. # The test executable normally only passes these two criteria for # 64-bit platforms. -add_executable(qsastime_testlib qsastime_testlib.c) -target_link_libraries(qsastime_testlib qsastime ${MATH_LIB}) +# Add in qsastime.c rather than use the library because don't want +# to make private library API visible. +add_executable(qsastime_testlib qsastime_testlib.c qsastime.c) +if(MATH_LIB) + target_link_libraries(qsastime_testlib ${MATH_LIB}) +endif(MATH_LIB) Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-18 06:31:14 UTC (rev 9544) +++ trunk/lib/qsastime/qsastime.c 2009-02-18 06:55:30 UTC (rev 9545) @@ -40,7 +40,6 @@ #include <ctype.h> #include <math.h> #include "qsastime.h" -#include "qsastimeP.h" /* MJD for 0000-01-01 (correctly Jan 01, BCE 1) */ /* Julian proleptic calendar value. */ #define MJD_0000J -678943 @@ -59,111 +58,6 @@ static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; -void configqsas(double scale, double offset1, double offset2, int ccontrol) -{ - /* Configure the transformation between continuous time and broken-down time - that is used for ctimeqsas, btimeqsas, and strfqsas. */ - - /* Allocate memory for qsasconfig if that hasn't been done by a - previous call. */ - if(qsasconfig == NULL) { - qsasconfig = (QSASConfig *) malloc((size_t) sizeof(QSASConfig)); - if (qsasconfig == NULL) { - fprintf(stderr, "configqsas: out of memory\n"); - exit(EXIT_FAILURE); - } - } - - if(scale != 0.) { - qsasconfig->scale = scale; - qsasconfig->offset1 = offset1; - qsasconfig->offset2 = offset2; - qsasconfig->ccontrol = ccontrol; - } else { - /* if scale is 0., then use default values. Currently, that - default is continuous time (stored as a double) is seconds since - 1970-01-01 while broken-down time is Gregorian with no other - additional corrections. */ - qsasconfig->scale = 1./86400.; - qsasconfig->offset1 = (double) MJD_1970; - qsasconfig->offset2 = 0.; - qsasconfig->ccontrol = 0x0; - } -} - -void closeqsas(void) -{ - /* Close library if it has been opened. */ - if(qsasconfig != NULL) { - free((void *) qsasconfig); - qsasconfig = NULL; - } -} - -int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime){ - MJDtime MJD_value, *MJD=&MJD_value; - int forceJulian, ret; - double integral_offset1, integral_offset2, integral_scaled_ctime; - - if(qsasconfig == NULL) { - fprintf(stderr, "libqsastime (ctimeqsas) ERROR: configqsas must be called first.\n"); - exit(EXIT_FAILURE); - } - - if(qsasconfig->ccontrol & 0x1) - forceJulian = 1; - else - forceJulian = -1; - - ret = setFromUT(year, month, day, hour, min, sec, MJD, forceJulian); - if(ret) - return ret; - *ctime = (((double)(MJD->base_day) - qsasconfig->offset1) - qsasconfig->offset2 + MJD->time_sec/(double) SecInDay)/qsasconfig->scale; - return 0; - -} - -void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime){ - MJDtime MJD_value, *MJD=&MJD_value; - int forceJulian; - double integral_offset1, integral_offset2, integral_scaled_ctime; - - if(qsasconfig == NULL) { - fprintf(stderr, "libqsastime (btimeqsas) ERROR: configqsas must be called first.\n"); - exit(EXIT_FAILURE); - } - - MJD->time_sec = SecInDay*(modf(qsasconfig->offset1, &integral_offset1) + modf(qsasconfig->offset2, &integral_offset2) + modf(ctime*qsasconfig->scale, &integral_scaled_ctime)); - MJD->base_day = (int) (integral_offset1+integral_offset2+integral_scaled_ctime); - - if(qsasconfig->ccontrol & 0x1) - forceJulian = 1; - else - forceJulian = -1; - - breakDownMJD(year, month, day, hour, min, sec, MJD, forceJulian); -} - -size_t strfqsas(char * buf, size_t len, const char *format, double ctime){ - MJDtime MJD_value, *MJD=&MJD_value; - int forceJulian; - double integral_offset1, integral_offset2, integral_scaled_ctime; - - if(qsasconfig == NULL) { - fprintf(stderr, "libqsastime (strfqsas) ERROR: configqsas must be called first.\n"); - exit(EXIT_FAILURE); - } - MJD->time_sec = SecInDay*(modf(qsasconfig->offset1, &integral_offset1) + modf(qsasconfig->offset2, &integral_offset2) + modf(ctime*qsasconfig->scale, &integral_scaled_ctime)); - MJD->base_day = (int) (integral_offset1+integral_offset2+integral_scaled_ctime); - - if(qsasconfig->ccontrol & 0x1) - forceJulian = 1; - else - forceJulian = -1; - - return strfMJD(buf, len, format, MJD, forceJulian); -} - int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { /* convert Gregorian date plus time to MJD */ @@ -963,3 +857,108 @@ } return posn; } + +void configqsas(double scale, double offset1, double offset2, int ccontrol) +{ + /* Configure the transformation between continuous time and broken-down time + that is used for ctimeqsas, btimeqsas, and strfqsas. */ + + /* Allocate memory for qsasconfig if that hasn't been done by a + previous call. */ + if(qsasconfig == NULL) { + qsasconfig = (QSASConfig *) malloc((size_t) sizeof(QSASConfig)); + if (qsasconfig == NULL) { + fprintf(stderr, "configqsas: out of memory\n"); + exit(EXIT_FAILURE); + } + } + + if(scale != 0.) { + qsasconfig->scale = scale; + qsasconfig->offset1 = offset1; + qsasconfig->offset2 = offset2; + qsasconfig->ccontrol = ccontrol; + } else { + /* if scale is 0., then use default values. Currently, that + default is continuous time (stored as a double) is seconds since + 1970-01-01 while broken-down time is Gregorian with no other + additional corrections. */ + qsasconfig->scale = 1./86400.; + qsasconfig->offset1 = (double) MJD_1970; + qsasconfig->offset2 = 0.; + qsasconfig->ccontrol = 0x0; + } +} + +void closeqsas(void) +{ + /* Close library if it has been opened. */ + if(qsasconfig != NULL) { + free((void *) qsasconfig); + qsasconfig = NULL; + } +} + +int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime){ + MJDtime MJD_value, *MJD=&MJD_value; + int forceJulian, ret; + double integral_offset1, integral_offset2, integral_scaled_ctime; + + if(qsasconfig == NULL) { + fprintf(stderr, "libqsastime (ctimeqsas) ERROR: configqsas must be called first.\n"); + exit(EXIT_FAILURE); + } + + if(qsasconfig->ccontrol & 0x1) + forceJulian = 1; + else + forceJulian = -1; + + ret = setFromUT(year, month, day, hour, min, sec, MJD, forceJulian); + if(ret) + return ret; + *ctime = (((double)(MJD->base_day) - qsasconfig->offset1) - qsasconfig->offset2 + MJD->time_sec/(double) SecInDay)/qsasconfig->scale; + return 0; + +} + +void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime){ + MJDtime MJD_value, *MJD=&MJD_value; + int forceJulian; + double integral_offset1, integral_offset2, integral_scaled_ctime; + + if(qsasconfig == NULL) { + fprintf(stderr, "libqsastime (btimeqsas) ERROR: configqsas must be called first.\n"); + exit(EXIT_FAILURE); + } + + MJD->time_sec = SecInDay*(modf(qsasconfig->offset1, &integral_offset1) + modf(qsasconfig->offset2, &integral_offset2) + modf(ctime*qsasconfig->scale, &integral_scaled_ctime)); + MJD->base_day = (int) (integral_offset1+integral_offset2+integral_scaled_ctime); + + if(qsasconfig->ccontrol & 0x1) + forceJulian = 1; + else + forceJulian = -1; + + breakDownMJD(year, month, day, hour, min, sec, MJD, forceJulian); +} + +size_t strfqsas(char * buf, size_t len, const char *format, double ctime){ + MJDtime MJD_value, *MJD=&MJD_value; + int forceJulian; + double integral_offset1, integral_offset2, integral_scaled_ctime; + + if(qsasconfig == NULL) { + fprintf(stderr, "libqsastime (strfqsas) ERROR: configqsas must be called first.\n"); + exit(EXIT_FAILURE); + } + MJD->time_sec = SecInDay*(modf(qsasconfig->offset1, &integral_offset1) + modf(qsasconfig->offset2, &integral_offset2) + modf(ctime*qsasconfig->scale, &integral_scaled_ctime)); + MJD->base_day = (int) (integral_offset1+integral_offset2+integral_scaled_ctime); + + if(qsasconfig->ccontrol & 0x1) + forceJulian = 1; + else + forceJulian = -1; + + return strfMJD(buf, len, format, MJD, forceJulian); +} Modified: trunk/lib/qsastime/qsastimeP.h =================================================================== --- trunk/lib/qsastime/qsastimeP.h 2009-02-18 06:31:14 UTC (rev 9544) +++ trunk/lib/qsastime/qsastimeP.h 2009-02-18 06:55:30 UTC (rev 9545) @@ -5,14 +5,14 @@ else */ #include "qsastime.h" -QSASTIMEDLLIMPEXP int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin); -QSASTIMEDLLIMPEXP const char * getDayOfWeek(const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getLongDayOfWeek( const MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getMonth(int m); -QSASTIMEDLLIMPEXP const char * getLongMonth(int m); -QSASTIMEDLLIMPEXP void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian); +int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); +void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); +size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); +void normalize_MJD(MJDtime *MJDout, const MJDtime *MJDin); +const char * getDayOfWeek(const MJDtime *MJD); +const char * getLongDayOfWeek( const MJDtime *MJD); +const char * getMonth(int m); +const char * getLongMonth(int m); +void getYAD(int *year, int *ifleapyear, int *doy, const MJDtime *MJD, int forceJulian); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-18 20:36:26
|
Revision: 9551 http://plplot.svn.sourceforge.net/plplot/?rev=9551&view=rev Author: airwin Date: 2009-02-18 20:36:22 +0000 (Wed, 18 Feb 2009) Log Message: ----------- Use #define for MJD_1970 rather than static const int. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-18 19:00:22 UTC (rev 9550) +++ trunk/lib/qsastime/qsastime.c 2009-02-18 20:36:22 UTC (rev 9551) @@ -52,9 +52,10 @@ the year 0 is a leap year in both calendars.*/ #define MJD_0001J -678577 #define MJD_0001G -678575 +/* MJD for Jan 01, 1970 00:00:00 Gregorian, the Unix epoch.*/ +#define MJD_1970 40587 static const double SecInDay = 86400; /* we ignore leap seconds */ -static const int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-18 19:00:22 UTC (rev 9550) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-18 20:36:22 UTC (rev 9551) @@ -41,6 +41,8 @@ #define TEST14 0x2000 #define TEST15 0x4000 #define TEST16 0x8000 +/* MJD for Jan 01, 1970 00:00:00 Gregorian, the Unix epoch.*/ +#define MJD_1970 40587 /* Recommended (by Linux timegm man page) POSIX equivalent of Linux timegm C library function */ time_t my_timegm(struct tm *tm) @@ -72,7 +74,6 @@ time_t secs_past_epoch, secs_past_epoch1, delta_secs; MJDtime MJD1, *pMJD1 = &MJD1; - static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ double jd; int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; if(!(forceJulian == 1 || forceJulian == -1)) { @@ -179,7 +180,6 @@ MJDtime MJD1, *pMJD1 = &MJD1; MJDtime MJD2, *pMJD2 = &MJD2; - static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ double jd; int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; if(!(forceJulian == 1 || forceJulian == -1)) { @@ -288,7 +288,6 @@ int seconds; MJDtime MJD1, *pMJD1 = &MJD1; - static int MJD_1970 = 40587; /* MJD for Jan 01, 1970 00:00:00 */ double jd; int test_choice, date_choice, ret; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <arj...@us...> - 2009-02-19 21:00:45
|
Revision: 9556 http://plplot.svn.sourceforge.net/plplot/?rev=9556&view=rev Author: arjenmarkus Date: 2009-02-19 21:00:39 +0000 (Thu, 19 Feb 2009) Log Message: ----------- Preliminary fix for the test program under Windows (especially older versions of the MS Visual C/C++ compiler). Applying the patch by Terrence was not enough: - The MSVC 6.0 compiler does not recognise "long long int" as a valid type (So for all MSVC compilers, the type "__int64" is used instead) - Running the qsastime_testlib program is unsuccessful with both bare Windows and Cygwin, as time_t is too small a data type (size = 4 bytes) - The patch assumes that _putenv() exists, but the leading underscore is unusual for Linux/UNIX, where putenv() is the standard. Tests to be added to fix this more properly: test for setenv(), putenv(), long long int versus __int64. This means a lot of extra tests and then the program will refuse to work anyway. For the moment simply committing this patched version without CMake tests to get the build going on Windows again. Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-19 18:18:47 UTC (rev 9555) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-19 21:00:39 UTC (rev 9556) @@ -65,7 +65,7 @@ add_executable(qsastime_test qsastime_test.c qsastime_extra.c qsastime.c) # Routine for testing just the library functions against their library -# inverses (to test self-consistency when such inverses exist) and also +# inverses (to test self-consistency when such inverses exist) and also # equivalent C library routines. # N.B. the routine immediately errors out at run time if sizeof(time_t) < 8 or # sizeof(int) !=4. The time_t constraint is because we want access to a large @@ -75,6 +75,7 @@ # 64-bit platforms. # Add in qsastime.c rather than use the library because don't want # to make private library API visible. + add_executable(qsastime_testlib qsastime_testlib.c qsastime.c) if(MATH_LIB) target_link_libraries(qsastime_testlib ${MATH_LIB}) Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-19 18:18:47 UTC (rev 9555) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-19 21:00:39 UTC (rev 9556) @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> #include <math.h> +#include <errno.h> #define TEST01 0x1 #define TEST02 0x2 @@ -44,6 +45,96 @@ /* MJD for Jan 01, 1970 00:00:00 Gregorian, the Unix epoch.*/ #define MJD_1970 40587 +/* + MCVC and possibly other systems do not have functions setenv and unsetenv. + + Below are versions of setenv and unsetenv implemented in terms of putenv. + + Configuration : + 1. Macro HAVE_SETENV + #define to 1 if system has SETENV Otherwise set to 0. + + 2. Macro HAVE_PUTENV + #define to 1 if system has PUTENV Otherwise set to 0. + Not used if HAVE_SETENV 1 + + 3. Macro CAN_FREE_PUTENV_BUFFER + + For some systems the string pointed to by the putenv argument becomes + part of the environment. A program should not alter or free the string, + and should not use stack or other transient string variables as arguments + to putenv(). + + For MSVC it appears from testing that putenv copies its values, + so we can cleanup as we go. + + Where the system copies the value, #define CAN_FREE_PUTENV_BUFFER 1 + + KNOWN PROBLEM + For MSVC setenv("ev","",1) UNSETS the environment variable rather than + setting it to and empty string. + + */ +#ifdef _MSC_VER +typedef __int64 longlong; +#define HAVE_SETENV 0 +#define HAVE_PUTENV 1 +#define CAN_FREE_PUTENV_BUFFER 1 +#else +typedef long long int longlong; +#define HAVE_SETENV 1 +#define HAVE_PUTENV 0 +#endif + + +#if defined(HAVE_SETENV) && defined(HAVE_PUTENV) && (!HAVE_SETENV && HAVE_PUTENV) + +static int putenv_wrapper(const char *name, const char *value) +{ + int rc = -1; + int len; + char* penvArg; + + len = strlen(name) + strlen(value) +2; + penvArg = (char*)malloc(len); + if(!penvArg){ + errno =ENOMEM; + return -1; + } + + sprintf(penvArg,"%s=%s",name,value); + rc = _putenv(penvArg); + +#ifdef CAN_FREE_PUTENV_BUFFER + free(penvArg); +#else + /* without more knowledge of putenv implementation + we cannot free penvArg */ +#endif + + return rc; +} +int setenv(const char *name, const char *value, int overwrite) +{ + if (!overwrite && getenv(name)) { + /* what should errno be set to in this case*/ + errno = EINVAL; + return -1; + } + return putenv_wrapper(name,value); +} + +int unsetenv(const char *name) +{ + if (!getenv(name)) { + errno = EINVAL; + return -1; + } + return putenv_wrapper(name,""); +} + +#endif + /* Recommended (by Linux timegm man page) POSIX equivalent of Linux timegm C library function */ time_t my_timegm(struct tm *tm) { @@ -72,7 +163,7 @@ struct tm tm1; struct tm *ptm1 = &tm1; time_t secs_past_epoch, secs_past_epoch1, delta_secs; - + MJDtime MJD1, *pMJD1 = &MJD1; double jd; int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; @@ -105,15 +196,15 @@ secs_past_epoch = my_timegm(ptm); delta_secs = abs(secs_past_epoch1-secs_past_epoch); if(delta_secs !=0) { - printf("setFromUT secs_past_epoch = %lld seconds\n", (long long int) secs_past_epoch1); - printf("my_timegm secs_past_epoch = %lld seconds\n", (long long int) secs_past_epoch); - printf("delta secs_past_epoch = %lld seconds\n", (long long int) (secs_past_epoch1 - secs_past_epoch)); + printf("setFromUT secs_past_epoch = %lld seconds\n", (longlong) secs_past_epoch1); + printf("my_timegm secs_past_epoch = %lld seconds\n", (longlong) secs_past_epoch); + printf("delta secs_past_epoch = %lld seconds\n", (longlong) (secs_past_epoch1 - secs_past_epoch)); printf("test failed with inconsistency between setFromUT and my_timegm\n"); return 1; } } - /* Inner TEST02: check minimal fields of strfMJD (Julian) or + /* Inner TEST02: check minimal fields of strfMJD (Julian) or strftime and strfMJD (Gregorian) */ if(inner_test_choice & TEST02) { if(forceJulian == -1) { @@ -143,7 +234,7 @@ breakDownMJD(&year1, &month1, &day1, &hour1, &min1, &sec1, pMJD1, forceJulian); ifsamedate = (year1-year == 0 && ( ((!iffeb29 || ifleapday) && (month1-month == 0 && day1-day == 0)) || ((iffeb29 && !ifleapday) && (month1 == 2 && day1 == 1)) )); ifsametime = (hour1-hour == 0 && min1-min ==0 && fabs(sec1-sec) < 1.e-10); - + if(!(ifsamedate && ifsametime)) { printf("output date calculated with breakDownMJD = %d-%02d-%02dT%02d:%02d:%018.15fZ\n", year1, month1+1, day1, hour1, min1, sec1); printf("test failed with inconsistency between setFromUT and breakDownMJD\n"); @@ -156,7 +247,7 @@ ptm1 = gmtime(&secs_past_epoch); ifsamedate = (ptm1->tm_year == ptm->tm_year && ( ((!iffeb29 || ifleapday) && (ptm1->tm_mon == ptm->tm_mon && ptm1->tm_mday == ptm->tm_mday)) || ((iffeb29 && !ifleapday) && (ptm1->tm_mon == 2 && ptm1->tm_mday == 1)) )); ifsametime = (ptm1->tm_hour == ptm->tm_hour && ptm1->tm_min == ptm->tm_min && ptm1->tm_sec == ptm->tm_sec); - + if(!(ifsamedate && ifsametime)) { printf("test failed with inconsistency between my_timegm and its C library inverse gmtime"); return 1; @@ -177,7 +268,7 @@ struct tm tm1; struct tm *ptm1 = &tm1; time_t secs_past_epoch, secs_past_epoch1; - + MJDtime MJD1, *pMJD1 = &MJD1; MJDtime MJD2, *pMJD2 = &MJD2; double jd; @@ -211,7 +302,7 @@ /* Inner TEST01: compare breakDownMJD with gmtime. */ if(forceJulian == -1 && (inner_test_choice & TEST01)) { ptm1 = gmtime(&secs_past_epoch); - if(!((ptm1->tm_year+1900) == year && ptm1->tm_mon == month && ptm1->tm_mday == day && ptm1->tm_hour == hour && ptm1->tm_min == min && ptm1->tm_sec == (int)sec)) { + if(!((ptm1->tm_year+1900) == year && ptm1->tm_mon == month && ptm1->tm_mday == day && ptm1->tm_hour == hour && ptm1->tm_min == min && ptm1->tm_sec == (int)sec)) { printf("date calculated with breakDownMJD = %d-%02d-%02dT%02d:%02d:%018.15fZ\n", year, month+1, day, hour, min, sec); printf("date calculated with gmtime = %d-%02d-%02dT%02d:%02d:%02dZ\n", ptm1->tm_year+1900, ptm1->tm_mon+1, ptm1->tm_mday, ptm1->tm_hour, ptm1->tm_min, ptm1->tm_sec); printf("test failed with inconsistency between breakDownMJD and gmtime\n"); @@ -219,7 +310,7 @@ } } - /* Inner TEST02: check minimal fields of strfMJD (Julian) or + /* Inner TEST02: check minimal fields of strfMJD (Julian) or strftime and strfMJD (Gregorian) */ if(inner_test_choice & TEST02) { if(forceJulian == -1) { @@ -259,9 +350,9 @@ if(forceJulian == -1 && (inner_test_choice & TEST04)) { secs_past_epoch1 = my_timegm(ptm); if(!(secs_past_epoch == secs_past_epoch1)) { - printf("secs_past_epoch calculated from input = %lld\n", (long long int) secs_past_epoch); - printf("secs_past_epoch calculated from my_timegm = %lld\n", (long long int) secs_past_epoch1); - printf("delta secs_past_epoch = %lld seconds\n", (long long int) (secs_past_epoch1 - secs_past_epoch)); + printf("secs_past_epoch calculated from input = %lld\n", (longlong) secs_past_epoch); + printf("secs_past_epoch calculated from my_timegm = %lld\n", (longlong) secs_past_epoch1); + printf("delta secs_past_epoch = %lld seconds\n", (longlong) (secs_past_epoch1 - secs_past_epoch)); printf("test failed with inconsistency between breakDownMJD and its C library based inverse, my_timegm\n"); return 1; } @@ -286,10 +377,10 @@ struct tm tm1; struct tm *ptm1 = &tm1; int seconds; - + MJDtime MJD1, *pMJD1 = &MJD1; double jd; - int test_choice, date_choice, ret; + int test_choice, date_choice, ret; printf("sizeof(time_t) = %d\n",(int)sizeof(time_t)); if(sizeof(time_t) < 8) { @@ -305,7 +396,7 @@ /* strftime affected by locale so force 0 timezone for this complete test. */ setenv("TZ", "", 1); tzset(); - + /* choose test(s) to be run using bit-pattern in test_choice that is input from stdin. */ scanf("%i", &test_choice); @@ -499,7 +590,7 @@ sec = 0.123456; // test reduced range of years that just barely misses overflowing - // the MJD integer. e.g., 6000000 overflows it. + // the MJD integer. e.g., 6000000 overflows it. for (year=-5000000; year<=5000000; year+=1) { ret = testlib_broken_down_time(year, month, day, hour, min, sec, 1, 0xffff, 0); if(ret) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-20 23:26:06
|
Revision: 9566 http://plplot.svn.sourceforge.net/plplot/?rev=9566&view=rev Author: airwin Date: 2009-02-20 23:26:02 +0000 (Fri, 20 Feb 2009) Log Message: ----------- Change from QSASConfig * formal parameter to const QSASConfig * formal parameter where appropriate. Modified Paths: -------------- trunk/lib/qsastime/README.qsastime_API trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h Modified: trunk/lib/qsastime/README.qsastime_API =================================================================== --- trunk/lib/qsastime/README.qsastime_API 2009-02-20 21:18:33 UTC (rev 9565) +++ trunk/lib/qsastime/README.qsastime_API 2009-02-20 23:26:02 UTC (rev 9566) @@ -120,7 +120,7 @@ ========================= void ctimeqsas (int year, int month, int day, int hour, int min, -double sec, double *ctime, QSASCONFIG *qsasconfig); +double sec, double *ctime, const QSASCONFIG *qsasconfig); Determine continuous time (ctime). Wraps the existing internal (not visible by default) setFromUT to use the four variables in qsasconfig @@ -134,7 +134,7 @@ ========================= void btimeqsas (int *year, int *month, int *day, int *hour, int *min, -double *sec, double ctime, QSASCONFIG *qsasconfig); +double *sec, double ctime, const QSASCONFIG *qsasconfig); Determine broken-down time (btime). This is the inverse of ctimeqsas. It wraps the existing internal (not visible by default) breakDownMJD @@ -148,7 +148,7 @@ ========================= size_t strfqsas (char * buf, size_t len, const char * format, const -double ctime, QSASCONFIG *qsasconfig); +double ctime, const QSASCONFIG *qsasconfig); This wraps the existing internal (not visible by default) strfMJD to use the four variables in qsasconfig discussed above in the Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-20 21:18:33 UTC (rev 9565) +++ trunk/lib/qsastime/qsastime.c 2009-02-20 23:26:02 UTC (rev 9566) @@ -915,7 +915,7 @@ } } -int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime, QSASConfig *qsasconfig){ +int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime, const QSASConfig *qsasconfig){ MJDtime MJD_value, *MJD=&MJD_value; int forceJulian, ret; double integral_offset1, integral_offset2, integral_scaled_ctime; @@ -938,7 +938,7 @@ } -void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime, QSASConfig *qsasconfig){ +void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime, const QSASConfig *qsasconfig){ MJDtime MJD_value, *MJD=&MJD_value; int forceJulian; double integral_offset1, integral_offset2, integral_scaled_ctime; @@ -959,7 +959,7 @@ breakDownMJD(year, month, day, hour, min, sec, MJD, forceJulian); } -size_t strfqsas(char * buf, size_t len, const char *format, double ctime, QSASConfig *qsasconfig) +size_t strfqsas(char * buf, size_t len, const char *format, double ctime, const QSASConfig *qsasconfig) { MJDtime MJD_value, *MJD=&MJD_value; int forceJulian; Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-20 21:18:33 UTC (rev 9565) +++ trunk/lib/qsastime/qsastime.h 2009-02-20 23:26:02 UTC (rev 9566) @@ -103,10 +103,10 @@ QSASTIMEDLLIMPEXP void closeqsas(QSASConfig **qsasconfig); -QSASTIMEDLLIMPEXP int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime, QSASConfig *qsasconfig); +QSASTIMEDLLIMPEXP int ctimeqsas(int year, int month, int day, int hour, int min, double sec, double * ctime, const QSASConfig *qsasconfig); -QSASTIMEDLLIMPEXP void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime, QSASConfig *qsasconfig); +QSASTIMEDLLIMPEXP void btimeqsas(int *year, int *month, int *day, int *hour, int *min, double *sec, double ctime, const QSASConfig *qsasconfig); -QSASTIMEDLLIMPEXP size_t strfqsas(char * buf, size_t len, const char *format, double ctime, QSASConfig *qsasconfig); +QSASTIMEDLLIMPEXP size_t strfqsas(char * buf, size_t len, const char *format, double ctime, const QSASConfig *qsasconfig); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2009-02-21 07:48:38
|
Revision: 9571 http://plplot.svn.sourceforge.net/plplot/?rev=9571&view=rev Author: airwin Date: 2009-02-21 07:48:29 +0000 (Sat, 21 Feb 2009) Log Message: ----------- Move to much simpler forceJulian logic where it is either true (Julian proleptic) or false (Gregorian proleptic) with no internal decisions based on one particular date of changeover (when historically there were many). The external API for libqsastime already had this simplified forceJulian logic, but this change makes it general for all the internal helper functions. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime_extra.c trunk/lib/qsastime/qsastime_extra.h trunk/lib/qsastime/qsastime_test.c trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-21 01:10:41 UTC (rev 9570) +++ trunk/lib/qsastime/qsastime.c 2009-02-21 07:48:29 UTC (rev 9571) @@ -58,7 +58,7 @@ static const double SecInDay = 86400; /* we ignore leap seconds */ static const int MonthStartDOY[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static const int MonthStartDOY_L[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; - + int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { /* convert Gregorian date plus time to MJD */ @@ -78,10 +78,6 @@ fprintf(stderr, "setfromUT: invalid month value\n"); exit(EXIT_FAILURE); } - if(forceJulian < -1 || forceJulian > 1) { - fprintf(stderr, "setfromUT: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } /* As year increases, year4/4 increments by 1 at year = -7, -3, 1, 5, 9, etc. */ /* As year increases, year100/100 increments by 1 at @@ -98,32 +94,29 @@ year400 = year - 1; } - if((forceJulian == 0 && (year < 1582 || (year == 1582 && month < 9) || (year == 1582 && month == 9 && day < 15))) || forceJulian == 1) - { - /* count leap years on proleptic Julian Calendar starting from MJD_0000J */ + if(forceJulian) { + /* count leap years on proleptic Julian Calendar starting from MJD_0000J */ leaps = year4 / 4; if(year%4 == 0) dbase_day = year * non_leaps + leaps + MonthStartDOY_L[month] + day + MJD_0000J; else dbase_day = year * non_leaps + leaps + MonthStartDOY[month] + day + MJD_0000J; - } - else - { - /* count leap years for proleptic Gregorian Calendar. */ - /* Algorithm below for 1858-11-17 (0 MJD) gives - leaps = 450 and hence dbase_day of 678941, so subtract that value - or add MJD_0000G (which is two days different from MJD_0000J, see - above). */ - leaps = year4 / 4 - year100 / 100 + year400 / 400; - - /* left to right associativity means the double value of - non_leaps propagate to make all calculations be - done in double precision without the potential of - integer overflow. The result should be a double which - stores the expected exact integer results of the - calculation with exact representation unless the - result is much larger than the integer overflow limit. */ - if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) + } else { + /* count leap years for proleptic Gregorian Calendar. */ + /* Algorithm below for 1858-11-17 (0 MJD) gives + leaps = 450 and hence dbase_day of 678941, so subtract that value + or add MJD_0000G (which is two days different from MJD_0000J, see + above). */ + leaps = year4 / 4 - year100 / 100 + year400 / 400; + + /* left to right associativity means the double value of + non_leaps propagate to make all calculations be + done in double precision without the potential of + integer overflow. The result should be a double which + stores the expected exact integer results of the + calculation with exact representation unless the + result is much larger than the integer overflow limit. */ + if( (year%4 == 0 && year%100 != 0) || (year%4 == 0 && year%400 == 0) ) dbase_day = year * non_leaps + leaps + MonthStartDOY_L[month] + day + MJD_0000G; else dbase_day = year * non_leaps + leaps + MonthStartDOY[month] + day + MJD_0000G; @@ -162,14 +155,10 @@ /* Get year and day of year from normalized MJD */ int j, ifcorrect, year4, year100, year400; - if(forceJulian < -1 || forceJulian > 1) { - fprintf(stderr, "getYAD: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } j = MJD->base_day; - if( forceJulian !=-1 && (j < -100840 || forceJulian == 1)) { + if(forceJulian) { /* Shift j epoch to 0000-01-01 for the Julian proleptic calendar.*/ j -= MJD_0000J; @@ -190,7 +179,6 @@ *ifleapyear = *year%4 == 0; } else { - /* forceJulian == -1 || (j >= -100840 && forceJulian == 0) */ /* Shift j epoch to 0000-01-01 for the Gregorian proleptic calendar.*/ j -= MJD_0000G; /* 365.245 is the exact period of the Gregorian year so year will be correct @@ -265,11 +253,6 @@ int doy, ifleapyear; MJDtime nMJD, *pnMJD=&nMJD; - if(forceJulian < -1 || forceJulian > 1) { - fprintf(stderr, "breakDownMJD: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } - normalize_MJD(pnMJD, MJD); /* Time part */ @@ -686,7 +669,7 @@ } else if(next == 'V') { - int days_in_wk1; + int days_in_wk1; /* week of year as a number, (01 - 53) start of week is Monday and first week has at least 3 days in year */ getYAD(&y1, &ifleapyear, &doy, pnMJD, forceJulian); days_in_wk1 = (pnMJD->base_day - doy - 3) % 7; @@ -777,8 +760,8 @@ } else if(next == 'Z') { - /* time zone and calendar, alwaus UTC */ - if(year < 1582 || (year == 1582 && month < 9) || (year == 1582 && month == 9 && day < 15) || forceJulian == 1) + /* time zone and calendar, always UTC */ + if(forceJulian) strncat(&(buf[posn]), "UTC Julian", last - posn); else strncat(&(buf[posn]), "UTC Gregorian", last - posn); @@ -881,7 +864,7 @@ if(ccontrol & 0x1) forceJulian = 1; else - forceJulian = -1; + forceJulian = 0; ret = setFromUT(year, month, day, hour, min, sec, MJD, forceJulian); if(ret) { fprintf(stderr, "configqsas: some problem with broken-down arguments\n"); @@ -928,7 +911,7 @@ if(qsasconfig->ccontrol & 0x1) forceJulian = 1; else - forceJulian = -1; + forceJulian = 0; ret = setFromUT(year, month, day, hour, min, sec, MJD, forceJulian); if(ret) @@ -954,7 +937,7 @@ if(qsasconfig->ccontrol & 0x1) forceJulian = 1; else - forceJulian = -1; + forceJulian = 0; breakDownMJD(year, month, day, hour, min, sec, MJD, forceJulian); } @@ -975,7 +958,7 @@ if(qsasconfig->ccontrol & 0x1) forceJulian = 1; else - forceJulian = -1; + forceJulian = 0; return strfMJD(buf, len, format, MJD, forceJulian); } Modified: trunk/lib/qsastime/qsastime_extra.c =================================================================== --- trunk/lib/qsastime/qsastime_extra.c 2009-02-21 01:10:41 UTC (rev 9570) +++ trunk/lib/qsastime/qsastime_extra.c 2009-02-21 07:48:29 UTC (rev 9571) @@ -43,7 +43,7 @@ static double MJDtoJD = 2400000.5; static double SecInDay = 86400; /* we ignore leap seconds */ -int setFromISOstring(const char* ISOstring, MJDtime *MJD) +int setFromISOstring(const char* ISOstring, MJDtime *MJD, int forceJulian) { double seconds; int y, m, d, h, min; @@ -76,7 +76,7 @@ if(startAt > len) return 1; seconds = strtod(&(ISOstring[startAt]), NULL); - setFromUT(y, m-1, d, h, min, seconds, MJD, 0); + setFromUT(y, m-1, d, h, min, seconds, MJD, forceJulian); return 0; } @@ -95,7 +95,12 @@ int leaps, lastyear,extraDays; - if(year <= 0) + /* N.B. There were known problems (both for the Julian and Gregorian + cases) with the following leap year logic that were completely fixed + in qsastime.c, but I (AWI) am not going to bother with these fixups + here since this code only used for a specific test routine for limited + date range and not for anything general. */ + if(forceJulian && year <= 0) { /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ @@ -105,7 +110,7 @@ MJD->base_day = year * 365 + leaps + doy - 678943; } - else if(year < 1582 || (year == 1582 && doy < 288) || forceJulian == 1) + else if(forceJulian) { /* count leap years on Julian Calendar */ /* MJD for Jan 1 0000 (correctly Jan 01, BCE 1) is - 678943, count from there */ @@ -140,12 +145,12 @@ } -void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD) +void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian) { /* utility to allow user to input dates BCE (BC) */ int year = 1 - yearBCE; - setFromUT(year, month, day, hour, min, sec, MJD, 0); + setFromUT(year, month, day, hour, min, sec, MJD, forceJulian); } @@ -215,7 +220,7 @@ return diff; } -const char * getISOString(MJDtime* MJD, int delim) +const char * getISOString(MJDtime* MJD, int delim, int forceJulian) { /* ISO time string for UTC */ /* uses default behaviour for Julian/Gregorian switch over */ @@ -231,7 +236,7 @@ int slen; char* ptr; - breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, 0); + breakDownMJD(&y, &m, &d, &hour, &min, &sec, MJD, forceJulian); if(y < 0) { Modified: trunk/lib/qsastime/qsastime_extra.h =================================================================== --- trunk/lib/qsastime/qsastime_extra.h 2009-02-21 01:10:41 UTC (rev 9570) +++ trunk/lib/qsastime/qsastime_extra.h 2009-02-21 07:48:29 UTC (rev 9571) @@ -47,17 +47,17 @@ #include "qsastime.h" QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); -QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD); +QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void setFromMJD(double ModifiedJulianDate, MJDtime *MJD); QSASTIMEDLLIMPEXP void setFromCDFepoch(double cdfepoch, MJDtime *MJD); QSASTIMEDLLIMPEXP void setFromJD(double JulianDate, MJDtime *MJD); -QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD); +QSASTIMEDLLIMPEXP int setFromISOstring(const char* ISOstring, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP double getMJD(MJDtime *MJD); QSASTIMEDLLIMPEXP double getJD(MJDtime *MJD); QSASTIMEDLLIMPEXP double getDiffDays(MJDtime *MJD1, MJDtime *MJD2); QSASTIMEDLLIMPEXP double getDiffSecs(MJDtime *MJD1, MJDtime *MJD2); QSASTIMEDLLIMPEXP double getCDFepoch(MJDtime *MJD); -QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim); +QSASTIMEDLLIMPEXP const char * getISOString(MJDtime *MJD, int delim, int forceJulian); /*** Warning getISOString is not thread safe ***/ #endif Modified: trunk/lib/qsastime/qsastime_test.c =================================================================== --- trunk/lib/qsastime/qsastime_test.c 2009-02-21 01:10:41 UTC (rev 9570) +++ trunk/lib/qsastime/qsastime_test.c 2009-02-21 07:48:29 UTC (rev 9571) @@ -64,7 +64,7 @@ printf( " MJD = %18.10f \n", getMJD(&MJD2)); printf( " JD = %18.10f \n\n", getJD(&MJD2)); - ISOstring = getISOString(&MJD2, 0); + ISOstring = getISOString(&MJD2, 0, 0); printf("ISO string = '%s'\n\n" , ISOstring); strfMJD(&(buf[0]), 360, "%Y-%m-%d %H:%M:%S%.", &MJD2, 0); @@ -87,30 +87,30 @@ epoch = getCDFepoch(&MJD2); printf("CDF epoch sec %18.3f\n", epoch); setFromCDFepoch(epoch, &MJD2); - printf("from CDF ISO string (CDF epoch is accurate to msec only) = '%s'\n" , getISOString(&MJD2, 1)); + printf("from CDF ISO string (CDF epoch is accurate to msec only) = '%s'\n" , getISOString(&MJD2, 1, 0)); printf("Day of week is/was %s\n\n", getDayOfWeek(&MJD2)); - ISOstring = getISOString(&MJD1,0); + ISOstring = getISOString(&MJD1,0, 0); printf("ISO string = '%s'\n\n" , ISOstring); - setFromISOstring(ISOstring, &MJD1); + setFromISOstring(ISOstring, &MJD1, 0); printf("for %s, MJD = %d, seconds = %17.11g\n", ISOstring, MJD1.base_day, MJD1.time_sec); - ISOstring = getISOString(&MJD1,1); + ISOstring = getISOString(&MJD1,1, 0); printf("ISO string = '%s'\n\n" , ISOstring); - setFromISOstring(ISOstring, &MJD1); + setFromISOstring(ISOstring, &MJD1, 0); printf("for %s, MJD = %d, seconds = %17.11g\n\n", ISOstring, MJD1.base_day, MJD1.time_sec); /* try julian/gregorian changeover */ y = 1752; m = 8; - d = 15; + d = 14; hour = 0; setFromUT(y, m, d, hour, min, sec, &MJD1, 0); - strcpy(&(copy[0]), getISOString(&MJD1,0)); /* copy because getISOString() returns a pointer to a static string */ + strcpy(&(copy[0]), getISOString(&MJD1, 0, 0)); /* copy because getISOString() returns a pointer to a static string */ printf("Gregorian = '%s'\n" , &(copy[0])); - setFromUT(y, m, d, hour, min, sec, &MJD1, 1); /* set from Julian date */ - printf("%s Julian = '%s' Gregorian, (give us back our 11 days)\n" ,getISOString(&MJD1,1), &(copy[0])); + //setFromUT(y, m, d, hour, min, sec, &MJD1, 1); /* set from Julian date */ + printf("%s Julian = '%s' Gregorian, (give us back our 11 days)\n" ,getISOString(&MJD1, 1, 1), &(copy[0])); /* Compare formatting from strftime() */ @@ -125,7 +125,7 @@ #ifndef _MSC_VER /* note %s not implemented in cygwin 1.5 gcc 3.x nothing printed */ strftime(&(buf[0]), 360, - " strftime(): (invalid before 1970)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); + " strftime(): (invalid before 1970 on some systems and subject to time zones on all systems)\n ------\n '%a %b %e %H:%M:%S UTC %Y' \n %c\n %D %F \n %j \n %r \n %s \n %e-%b-%Y", ptm); #else /* the following format options are not defined in MSVC (2008) and are replaced as follows Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-21 01:10:41 UTC (rev 9570) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-21 07:48:29 UTC (rev 9571) @@ -167,10 +167,6 @@ MJDtime MJD1, *pMJD1 = &MJD1; double jd; int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; - if(!(forceJulian == 1 || forceJulian == -1)) { - fprintf(stderr, "testlib_broken_down_time: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } ptm->tm_year = year-1900; ptm->tm_mon = month; ptm->tm_mday = day; @@ -178,7 +174,7 @@ ptm->tm_min = min; ptm->tm_sec = (int) sec; if(verbose) { - if(forceJulian == 1) { + if(forceJulian) { printf("Start of Julian proleptic inner test\n"); printf("input and output (strfMJD) date/time\n"); } else { @@ -191,7 +187,7 @@ setFromUT(year, month, day, hour, min, sec, pMJD1, forceJulian); /* Inner TEST01: compare setFromUT with my_timegm. */ - if(forceJulian == -1 && (inner_test_choice & TEST01)) { + if(!forceJulian && (inner_test_choice & TEST01)) { secs_past_epoch1 = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + (int)pMJD1->time_sec); secs_past_epoch = my_timegm(ptm); delta_secs = abs(secs_past_epoch1-secs_past_epoch); @@ -207,7 +203,7 @@ /* Inner TEST02: check minimal fields of strfMJD (Julian) or strftime and strfMJD (Gregorian) */ if(inner_test_choice & TEST02) { - if(forceJulian == -1) { + if(!forceJulian) { strftime(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", ptm); if(verbose) printf("%s", buf); @@ -222,7 +218,7 @@ printf("setFromUT JD = %25.16f days\n", jd); } - if(forceJulian == 1) + if(forceJulian) ifleapyear = (year%4 == 0); else ifleapyear = ((year%4 == 0 && year%100 != 0) || year%400 == 0); @@ -243,7 +239,7 @@ } /* Inner TEST04: compare setFromUT with its inverse, the C library gmtime.*/ - if(forceJulian == -1 && (inner_test_choice & TEST04)) { + if(!forceJulian && (inner_test_choice & TEST04)) { ptm1 = gmtime(&secs_past_epoch); ifsamedate = (ptm1->tm_year == ptm->tm_year && ( ((!iffeb29 || ifleapday) && (ptm1->tm_mon == ptm->tm_mon && ptm1->tm_mday == ptm->tm_mday)) || ((iffeb29 && !ifleapday) && (ptm1->tm_mon == 2 && ptm1->tm_mday == 1)) )); ifsametime = (ptm1->tm_hour == ptm->tm_hour && ptm1->tm_min == ptm->tm_min && ptm1->tm_sec == ptm->tm_sec); @@ -273,10 +269,6 @@ MJDtime MJD2, *pMJD2 = &MJD2; double jd; int ifleapyear, ifleapday, iffeb29, ifsamedate, ifsametime; - if(!(forceJulian == 1 || forceJulian == -1)) { - fprintf(stderr, "testlib_MJD: invalid forceJulian value\n"); - exit(EXIT_FAILURE); - } normalize_MJD(pMJD1, MJD); secs_past_epoch = (time_t) (86400.*((double)pMJD1->base_day - (double) MJD_1970) + pMJD1->time_sec); @@ -289,7 +281,7 @@ ptm->tm_min = min; ptm->tm_sec = (int) sec; if(verbose) { - if(forceJulian == 1) { + if(forceJulian) { printf("Start of Julian proleptic inner test\n"); printf("input and output (strfMJD) date/time\n"); } else { @@ -300,7 +292,7 @@ } /* Inner TEST01: compare breakDownMJD with gmtime. */ - if(forceJulian == -1 && (inner_test_choice & TEST01)) { + if(!forceJulian && (inner_test_choice & TEST01)) { ptm1 = gmtime(&secs_past_epoch); if(!((ptm1->tm_year+1900) == year && ptm1->tm_mon == month && ptm1->tm_mday == day && ptm1->tm_hour == hour && ptm1->tm_min == min && ptm1->tm_sec == (int)sec)) { printf("date calculated with breakDownMJD = %d-%02d-%02dT%02d:%02d:%018.15fZ\n", year, month+1, day, hour, min, sec); @@ -313,7 +305,7 @@ /* Inner TEST02: check minimal fields of strfMJD (Julian) or strftime and strfMJD (Gregorian) */ if(inner_test_choice & TEST02) { - if(forceJulian == -1) { + if(!forceJulian) { strftime(&(buf[0]), 360, "%Y-%m-%dT%H:%M:%SZ\n", ptm); if(verbose) printf("%s", buf); @@ -328,7 +320,7 @@ printf("JD = %25.16f days\n", jd); } - if(forceJulian == 1) + if(forceJulian) ifleapyear = (year%4 == 0); else ifleapyear = ((year%4 == 0 && year%100 != 0) || year%400 == 0); @@ -347,7 +339,7 @@ } /* Inner TEST04: compare breakDownMJD with its inverse, my_timegm */ - if(forceJulian == -1 && (inner_test_choice & TEST04)) { + if(!forceJulian && (inner_test_choice & TEST04)) { secs_past_epoch1 = my_timegm(ptm); if(!(secs_past_epoch == secs_past_epoch1)) { printf("secs_past_epoch calculated from input = %lld\n", (longlong) secs_past_epoch); @@ -430,7 +422,7 @@ ret = testlib_broken_down_time(year, month, day, hour, min, sec, 1, 0xffff, 1); if(ret) return ret; - ret = testlib_broken_down_time(year, month, day, hour, min, sec, -1, 0xffff, 1); + ret = testlib_broken_down_time(year, month, day, hour, min, sec, 0, 0xffff, 1); if(ret) return ret; } @@ -466,7 +458,7 @@ ret = testlib_broken_down_time(year, month, day, hour, min, sec, 1, 0xffff, 1); if(ret) return ret; - ret = testlib_broken_down_time(year, month, day, hour, min, sec, -1, 0xffff, 1); + ret = testlib_broken_down_time(year, month, day, hour, min, sec, 0, 0xffff, 1); if(ret) return ret; } @@ -505,7 +497,7 @@ ret = testlib_broken_down_time(year, month, day, hour, min, sec, 1, 0xffff, 1); if(ret) return ret; - ret = testlib_broken_down_time(year, month, day, hour, min, sec, -1, 0xffff, 1); + ret = testlib_broken_down_time(year, month, day, hour, min, sec, 0, 0xffff, 1); if(ret) return ret; } @@ -532,7 +524,7 @@ printf("Test 04 of small second range near Year 0 (Gregorian)\n"); - ret= setFromUT(0, 0, 1, 0, 0, 0., pMJD1, -1); + ret= setFromUT(0, 0, 1, 0, 0, 0., pMJD1, 0); if(ret) { printf("Test 04 cannot even start for Year 0 (Gregorian)"); return ret; @@ -540,7 +532,7 @@ for (seconds=-5; seconds < 5; seconds++) { printf("\n"); - ret = testlib_MJD(pMJD1, -1, 0xffff, 1); + ret = testlib_MJD(pMJD1, 0, 0xffff, 1); if(ret) return ret; pMJD1->time_sec ++; @@ -549,7 +541,7 @@ printf("Test 04 of small second range near 2009-01-01 (Gregorian) when a leap second was inserted\n"); - ret= setFromUT(2009, 0, 1, 0, 0, 0.1234567890123456-5., pMJD1, -1); + ret= setFromUT(2009, 0, 1, 0, 0, 0.1234567890123456-5., pMJD1, 0); if(ret) { printf("Test 04 cannot even start for Year 0 (Gregorian)"); return ret; @@ -557,7 +549,7 @@ for (seconds=-5; seconds < 5; seconds++) { printf("\n"); - ret = testlib_MJD(pMJD1, -1, 0xffff, 1); + ret = testlib_MJD(pMJD1, 0, 0xffff, 1); if(ret) return ret; pMJD1->time_sec ++; @@ -595,7 +587,7 @@ ret = testlib_broken_down_time(year, month, day, hour, min, sec, 1, 0xffff, 0); if(ret) return ret; - ret = testlib_broken_down_time(year, month, day, hour, min, sec, -1, 0xffff, 0); + ret = testlib_broken_down_time(year, month, day, hour, min, sec, 0, 0xffff, 0); if(ret) return ret; } @@ -604,7 +596,7 @@ if(test_choice & TEST06) { printf("Test 06 (non-verbose) of all seconds from late 2007 to early 2009\n"); - ret= setFromUT(2007, 11, 30, 0, 0, 0., pMJD1, -1); + ret= setFromUT(2007, 11, 30, 0, 0, 0., pMJD1, 0); if(ret) { printf("Test 06 cannot even start"); return ret; @@ -617,7 +609,7 @@ if(ret) return ret; - ret = testlib_MJD(pMJD1, -1, 0xffff, 0); + ret = testlib_MJD(pMJD1, 0, 0xffff, 0); if(ret) return ret; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <and...@us...> - 2009-02-21 17:57:10
|
Revision: 9577 http://plplot.svn.sourceforge.net/plplot/?rev=9577&view=rev Author: andrewross Date: 2009-02-21 17:57:03 +0000 (Sat, 21 Feb 2009) Log Message: ----------- Move structure definitions into qsastimeP.h. These are not required for the functions in qsastime. Hiding the details is good practice. These QSASConfig type can be considered as a black box handle, and hence users should not meddle with the contents. Modified Paths: -------------- trunk/lib/qsastime/qsastime.c trunk/lib/qsastime/qsastime.h trunk/lib/qsastime/qsastimeP.h trunk/lib/qsastime/qsastime_extra.h Modified: trunk/lib/qsastime/qsastime.c =================================================================== --- trunk/lib/qsastime/qsastime.c 2009-02-21 17:54:08 UTC (rev 9576) +++ trunk/lib/qsastime/qsastime.c 2009-02-21 17:57:03 UTC (rev 9577) @@ -39,7 +39,8 @@ */ #include <ctype.h> #include <math.h> -#include "qsastime.h" +#include "qsastimeP.h" + /* MJD for 0000-01-01 (correctly Jan 01, BCE 1) */ /* Julian proleptic calendar value. */ #define MJD_0000J -678943 Modified: trunk/lib/qsastime/qsastime.h =================================================================== --- trunk/lib/qsastime/qsastime.h 2009-02-21 17:54:08 UTC (rev 9576) +++ trunk/lib/qsastime/qsastime.h 2009-02-21 17:57:03 UTC (rev 9577) @@ -46,58 +46,9 @@ /* include header file for dll definitions */ #include "qsastimedll.h" +struct QSASConfigStruct; +typedef struct QSASConfigStruct QSASConfig; -typedef struct MJDtimeStruct -{ - /* - MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). - The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. - */ - - int base_day; /* integer part of MJD used as default */ - double time_sec; /* seconds from start of base_day */ - -}MJDtime; - -typedef struct QSASConfigStruct -{ - - /* Values used to define the transformation between broken down time - and continuous time for the public API of libqsastime, - continuous_time_qsas, broken_down_time_qsas, and strfqsas.*/ - - /* scale multiplies the continuous time variable to convert the units to - days. */ - double scale; - - /* offset1 and offset2 (in days) specifies the amount to add to the - scaled continuous time to derive the MJD time value that is used - internally by libqsastime. Normally epoch1 is an integral - value (which can be exactly stored in a double for a very wide - range of integers) and offset2 is normally a non-integral value - whose absolute value is less than 1. This arrangement allows the - continuous time variable in the API to be stored as a single double - without compromising numerical precision if epoch1 and epoch2 - are chosen wisely. */ - double offset1, offset2; - - /* The various bits of ccontrol are used as independent switches to - control optional additional corrections which define the - transformation between continuous time and broken-down time. - - If bit 0 (the lowest order bit of ccontrol) is 1 the Julian - proleptic calendar is used for broken-down time. Otherwise the - Gregorian proleptic calendar is used for broken-down time. - - If bit 1 is 1, an additional correction for the difference - between atomic-clock based times and UTC is applied to the broken-down - times. - - We reserve other bits of ccontrol for future use. */ - int ccontrol; - -}QSASConfig; - /* externally accessible functions */ QSASTIMEDLLIMPEXP void configqsas(double scale, double offset1, double offset2, int ccontrol, int ifbtime_offset, int year, int month, int day, int hour, int min, double sec, QSASConfig **qsasconfig); Modified: trunk/lib/qsastime/qsastimeP.h =================================================================== --- trunk/lib/qsastime/qsastimeP.h 2009-02-21 17:54:08 UTC (rev 9576) +++ trunk/lib/qsastime/qsastimeP.h 2009-02-21 17:57:03 UTC (rev 9577) @@ -1,10 +1,65 @@ #ifndef _QSASTIMEP_H_ #define _QSASTIMEP_H_ -/* Declaration of private functions within libqsastime that are needed + +/* Declaration of private structures within libqsastime which the user does + not need to acccess. + Also definition of functions within libqsastime that are needed for testing of libqsastime, but which are not normally needed for anything else */ #include "qsastime.h" + +typedef struct MJDtimeStruct +{ + /* + MJD starts at 0h, so truncating MJD always gives the same day whatever the time (unlike JD). + The MJD base day is arbitrary, i.e. seconds can be greater than one day or even negative. + */ + + int base_day; /* integer part of MJD used as default */ + double time_sec; /* seconds from start of base_day */ + +}MJDtime; + +struct QSASConfigStruct +{ + + /* Values used to define the transformation between broken down time + and continuous time for the public API of libqsastime, + continuous_time_qsas, broken_down_time_qsas, and strfqsas.*/ + + /* scale multiplies the continuous time variable to convert the units to + days. */ + double scale; + + /* offset1 and offset2 (in days) specifies the amount to add to the + scaled continuous time to derive the MJD time value that is used + internally by libqsastime. Normally epoch1 is an integral + value (which can be exactly stored in a double for a very wide + range of integers) and offset2 is normally a non-integral value + whose absolute value is less than 1. This arrangement allows the + continuous time variable in the API to be stored as a single double + without compromising numerical precision if epoch1 and epoch2 + are chosen wisely. */ + double offset1, offset2; + + /* The various bits of ccontrol are used as independent switches to + control optional additional corrections which define the + transformation between continuous time and broken-down time. + + If bit 0 (the lowest order bit of ccontrol) is 1 the Julian + proleptic calendar is used for broken-down time. Otherwise the + Gregorian proleptic calendar is used for broken-down time. + + If bit 1 is 1, an additional correction for the difference + between atomic-clock based times and UTC is applied to the broken-down + times. + + We reserve other bits of ccontrol for future use. */ + int ccontrol; + +}; + int setFromUT(int year, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); void breakDownMJD(int *year, int *month, int *day, int *hour, int *min, double *sec, const MJDtime *MJD, int forceJulian); size_t strfMJD(char * buf, size_t len, const char *format, const MJDtime *MJD, int forceJulian); Modified: trunk/lib/qsastime/qsastime_extra.h =================================================================== --- trunk/lib/qsastime/qsastime_extra.h 2009-02-21 17:54:08 UTC (rev 9576) +++ trunk/lib/qsastime/qsastime_extra.h 2009-02-21 17:57:03 UTC (rev 9577) @@ -44,7 +44,7 @@ #include <stdlib.h> #include <string.h> /* include header file for dll definitions */ -#include "qsastime.h" +#include "qsastimeP.h" QSASTIMEDLLIMPEXP void setFromDOY(int year, int doy, int hour, int min, double sec, MJDtime *MJD, int forceJulian); QSASTIMEDLLIMPEXP void setFromBCE(int yearBCE, int month, int day, int hour, int min, double sec, MJDtime *MJD, int forceJulian); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <arj...@us...> - 2009-02-23 21:13:09
|
Revision: 9592 http://plplot.svn.sourceforge.net/plplot/?rev=9592&view=rev Author: arjenmarkus Date: 2009-02-23 21:13:04 +0000 (Mon, 23 Feb 2009) Log Message: ----------- Added tests for long long int type and API for setting an environment variable (Tested on Windows XP and Cygwin - seems to work properly on MinGW too, but there the build currently fails on the NN library) Modified Paths: -------------- trunk/lib/qsastime/CMakeLists.txt trunk/lib/qsastime/qsastime_testlib.c Modified: trunk/lib/qsastime/CMakeLists.txt =================================================================== --- trunk/lib/qsastime/CMakeLists.txt 2009-02-23 20:47:30 UTC (rev 9591) +++ trunk/lib/qsastime/CMakeLists.txt 2009-02-23 21:13:04 UTC (rev 9592) @@ -19,33 +19,89 @@ # along with PLplot; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -# Routine for generating a header of data to be used by the -# TAI-UTC transformation code. +# +# Test a few properties of the current C compiler +# +SET(INC_FILE "${CMAKE_CURRENT_BINARY_DIR}/qsastime_testlib.h") +SET(C_FILE "${CMAKE_CURRENT_BINARY_DIR}/qsastime_probe.c") +SET(MACROS LONGLONG __INT64) +FOREACH(TYPE_MACRO ${MACROS}) + FILE(WRITE "${C_FILE}" + "#define ${TYPE_MACRO} +#ifdef LONGLONG +typedef long long int longlong; +#endif + #ifdef __INT64 +typedef __int64 longlong; +#endif +int main( int argc, char *argv[]) { + longlong l; + exit(0); +}") + TRY_COMPILE(TYPE_FOUND + ${CMAKE_BINARY_DIR} + ${C_FILE} + OUTPUT_VARIABLE OUTPUT) + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Determining if the C compiler has support for 64-bits integers failed with " + "the following output:\n${OUTPUT}\n\n") + IF (TYPE_FOUND) + MESSAGE(STATUS "Check for 64-bits integer type - found") + FILE(WRITE ${INC_FILE} "#define ${TYPE_MACRO}") + ELSE (TYPE_FOUND) + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Determining if the C compiler has support for 64-bits integers failed with " + "the following output:\n${OUTPUT}\n\n") + ENDIF (TYPE_FOUND) +ENDFOREACH(TYPE_MACRO ${MACROS}) +IF (NOT TYPE_FOUND) + FILE(WRITE ${INC_FILE} "#define NO_LONG_LONG") + MESSAGE(STATUS "Check for 64-bits integer type - failed") +ENDIF (NOT TYPE_FOUND) -add_executable(tai-utc-gen ${CMAKE_CURRENT_SOURCE_DIR}/tai-utc-gen.c) +SET(MACROS HAVE_SETENV HAVE_PUTENV HAVE_UNDERSCORE_PUTENV) +FOREACH(ENV_MACRO ${MACROS}) + FILE(WRITE "${C_FILE}" + "#include <stdlib.h> +#define ${ENV_MACRO} +int main( int argc, char *argv[]) { + char *tz; + tz = getenv(\"TZ\"); +#ifdef HAVE_SETENV + setenv(\"TZ\", \"\", 1); + if (tz) { + setenv(\"TZ\", tz, 1); + } +#endif +#ifdef HAVE_PUTENV + putenv(\"TZ=\"); +#endif +#ifdef HAVE_UNDERSCORE_PUTENV + _putenv(\"TZ=\"); +#endif + exit(0); +}") + TRY_COMPILE(ENV_FOUND + ${CMAKE_BINARY_DIR} + ${C_FILE} + OUTPUT_VARIABLE OUTPUT) + IF (ENV_FOUND) + FILE(APPEND ${INC_FILE} "\n#define ${ENV_MACRO}") + MESSAGE(STATUS "Check for environment API - found") + ELSE (ENV_FOUND) + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log + "Determining if the C compiler has support for setting environment variables failed with " + "the following output:\n${OUTPUT}\n\n") + ENDIF (ENV_FOUND) +ENDFOREACH(ENV_MACRO ${MACROS}) +IF (NOT ENV_FOUND) + FILE(APPEND ${INC_FILE} "\n#define NO_ENV_API") + MESSAGE(STATUS "Check for environment API - failed") +ENDIF (NOT ENV_FOUND) -get_target_property( - tai-utc-gen_LOCATION - tai-utc-gen - LOCATION - ) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tai-utc.h - COMMAND ${tai-utc-gen_LOCATION} - ${CMAKE_CURRENT_SOURCE_DIR}/tai-utc.dat - ${CMAKE_CURRENT_BINARY_DIR}/tai-utc.h - DEPENDS - ${tai-utc-gen_LOCATION} - ${CMAKE_CURRENT_SOURCE_DIR}/tai-utc.dat - ) - -# This target-level dependency needed below. -add_custom_target( - tai-utc.h_built - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tai-utc.h - ) - +# +# The header file has been written, now go on +# include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} @@ -62,8 +118,6 @@ endif(BUILD_SHARED_LIBS) add_library(qsastime ${qsastime_LIB_SRCS}) -add_dependencies(qsastime tai-utc.h_built) - if(MATH_LIB) target_link_libraries(qsastime ${MATH_LIB}) endif(MATH_LIB) @@ -74,7 +128,6 @@ VERSION ${qsastime_VERSION} INSTALL_NAME_DIR "${LIB_DIR}" ) - set(qsastime_INSTALLED_HEADERS qsastime.h qsastimedll.h @@ -107,15 +160,7 @@ # Add in qsastime.c rather than use the library because don't want # to make private library API visible. -option( - QSASTIME_TESTLIB - "Option for building qsastime_testlib which fails on some Windows platforms" - OFF - ) - -if(QSASTIME_TESTLIB) - add_executable(qsastime_testlib qsastime_testlib.c qsastime.c) - if(MATH_LIB) - target_link_libraries(qsastime_testlib ${MATH_LIB}) - endif(MATH_LIB) -endif(QSASTIME_TESTLIB) +add_executable(qsastime_testlib qsastime_testlib.c qsastime.c) +if(MATH_LIB) + target_link_libraries(qsastime_testlib ${MATH_LIB}) +endif(MATH_LIB) Modified: trunk/lib/qsastime/qsastime_testlib.c =================================================================== --- trunk/lib/qsastime/qsastime_testlib.c 2009-02-23 20:47:30 UTC (rev 9591) +++ trunk/lib/qsastime/qsastime_testlib.c 2009-02-23 21:13:04 UTC (rev 9592) @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "qsastime_testlib.h" #include "qsastime.h" #include "qsastimeP.h" #include <time.h> @@ -75,19 +76,21 @@ setting it to and empty string. */ -#ifdef _MSC_VER -typedef __int64 longlong; -#define HAVE_SETENV 0 -#define HAVE_PUTENV 1 -#define CAN_FREE_PUTENV_BUFFER 1 -#else +#if !defined(NO_LONG_LONG) && !defined(NO_ENV_API) + +#ifdef LONGLONG typedef long long int longlong; -#define HAVE_SETENV 1 -#define HAVE_PUTENV 0 #endif +#ifdef __INT64 +typedef __int64 longlong; +#endif +#ifdef HAVE_UNDERSCORE_PUTENV +#define putenv _putenv +#define HAVE_PUTENV +#endif -#if defined(HAVE_SETENV) && defined(HAVE_PUTENV) && (!HAVE_SETENV && HAVE_PUTENV) +#if defined(HAVE_PUTENV) static int putenv_wrapper(const char *name, const char *value) { @@ -618,3 +621,11 @@ return 0; } + +#else /* !defined(NO_LONG_LONG) && !defined(NO_ENV_API) */ +int main() { + + printf("test abandoned because there is no useable 64-bits integer type for this\n\ +compiler/platform or there is no useable environment API"); +} +#endif /* !defined(NO_LONG_LONG) && !defined(NO_ENV_API) */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |