Home
Download
The API
Example Code
Why I Coded These
Known Calendars
Transition Dates
Udunits
|
Example code
Here I'm going to show you example code for how to accomplish particular
tasks. If you want more description and explanations, consider
reading the tutorial instead.
If you want to see the nitty-gritty details, maybe looking at
the list of functions would be better.
This first example shows how to use the utCalendar2_cal and utInvCalendar2_cal calls.
Note that you do not have to initialize a CalCalcs calendar to use these calls;
the only thing passed is the name of the calendar to use (i.e., "Standard", "Gregorian",
"Juilan", etc.). This simplifies the interface for these two routines and makes them
nearly drop-in replacements for the old utCalendar and utInvCalendar routines found in
version 1 of the udunits library.
#include <stdio.h>
#include <stdlib.h>
#include <udunits2.h>
#include "calcalcs.h"
#include "utCalendar2_cal.h"
/* Exercise the udunits calls */
int main( int argc, char *argv[] )
{
static char *units = "seconds since 2010-01-06 09:20";
static char *calendar = "Standard";
ut_system *u_system;
ut_unit *u_1;
double tval, tval_inv, sec;
int ierr, yr, mo, day, hr, min;
/* Initialize the udunits-2 library */
if( (u_system = ut_read_xml( NULL )) == NULL ) {
fprintf( stderr, "Error initializing udunits-2 unit system\n" );
exit(-1);
}
/* Parse the units strings */
if( (u_1 = ut_parse( u_system, units, UT_ASCII )) == NULL ) {
fprintf( stderr, "Error parsing units string \"%s\"\n", units );
exit(-1);
}
/* Make the Calendar calls */
tval = 86460.0; /* in seconds, this is 1 day and 1 minute */
if( (ierr = utCalendar2_cal( tval, u_1, &yr, &mo, &day, &hr, &min, &sec, calendar )) != 0 ) {
fprintf( stderr, "Error on utCalendar2_cal call: %s\n", ccs_err_str(ierr) );
exit(-1);
}
printf( "%lf %s in the %s calendar equals date %04d-%02d-%02d %02d:%02d:%06.3lf\n",
tval, units, calendar, yr, mo, day, hr, min, sec );
/* For a test, convert back from the date to a value and see if it matches */
if( (ierr = utInvCalendar2_cal( yr, mo, day, hr, min, sec, u_1, &tval_inv, calendar )) != 0 ) {
fprintf( stderr, "Error on utCalendar2_cal call: %s\n", ccs_err_str(ierr) );
exit(-1);
}
printf( "Test: %04d-%02d-%02d %02d:%02d:%06.3lf is %lf %s in the %s calendar\n",
yr, mo, day, hr, min, sec, tval_inv, units, calendar );
return(0);
}
Example CalCalcs code
This second example shows how to use the Calcalcs library proper.
Note that you do not have to link to the udunits-2 library to use this code.
This example program can be downloaded along with the main CalCalcs
code here.
#include <stdio.h>
#include <stdlib.h>
#include "calcalcs.h"
/*=======================================================================*/
void do_tests( const char *calendar_name, int year, int month, int day )
{
calcalcs_cal *cal;
int ierr, jday, leap, tyear, tmonth, tday, doy, days_since;
/* Initialize the calendar */
if( (cal = ccs_init_calendar( calendar_name )) == NULL ) {
fprintf( stderr, "Error trying to initialize calendar %s\n",
calendar_name );
exit(-1);
}
/* Is the passed year a leap year? */
if( (ierr = ccs_isleap( cal, year, &leap )) != 0 )
printf( "Determining whether %d is a leap year in the %s calendar returned an error: %s\n",
year, calendar_name, ccs_err_str(ierr) );
else
printf( "Year %d %s a leap year in the %s calendar\n",
year, ((leap==1)?"IS":"is NOT"), calendar_name );
/* Convert the passed Y/M/D date to a Julian day number */
if( (ierr = ccs_date2jday( cal, year, month, day, &jday )) != 0 )
printf( "Turning %04d-%02d-%02d into a Julian day returned an error: %s\n",
year, month, day, ccs_err_str(ierr) );
else
printf( "%04d-%02d-%02d in the %s calendar is Julian day %d\n",
year, month, day, calendar_name, jday );
/* Convert the julian day we just calcalculated back into a date, it should match! */
if( (ierr = ccs_jday2date( cal, jday, &tyear, &tmonth, &tday )) != 0 )
printf( "Turning Julian day %d into a date returned an error: %s\n",
jday, ccs_err_str(ierr) );
else
printf( "Julian day %d is date %04d-%02d-%02d in the %s calendar\n",
jday, tyear, tmonth, tday, calendar_name );
/* Get the day number of the year */
if( (ierr = ccs_date2doy( cal, year, month, day, &doy )) != 0 )
printf( "Turning %04d-%02d-%02d into a day-of-year returned an error: %s\n",
year, month, day, ccs_err_str(ierr) );
else
printf( "%04d-%02d-%02d in the %s calendar is day-of-year number %d\n",
year, month, day, calendar_name, doy );
/* Convert the day-of-year we just calculated back into a date, it should match */
if( (ierr = ccs_doy2date( cal, year, doy, &tmonth, &tday )) != 0 )
printf( "Turning day %d of year %d into a date in the %s calendar returned an error: %s\n",
doy, year, calendar_name, ccs_err_str(ierr) );
else
printf( "day-of-year %d of year %d is date %04d-%02d-%02d in the %s calendar\n",
doy, year, year, tmonth, tday, calendar_name );
/* Do a couple "days since" calls */
days_since = 5;
if( (ierr = ccs_dayssince( cal, year, month, day, days_since, cal, &tyear, &tmonth, &tday )) != 0 )
printf( "Calculating %d days since %04d-%02d-%02d in the %s calendar gave error %s\n",
days_since, year, month, day, calendar_name, ccs_err_str(ierr));
else
printf( "%d days since %04d-%02d-%02d in the %s calendar is %04d-%02d-%02d\n",
days_since, year, month, day, calendar_name, tyear, tmonth, tday );
days_since = -5;
if( (ierr = ccs_dayssince( cal, year, month, day, days_since, cal, &tyear, &tmonth, &tday )) != 0 )
printf( "Calculating %d days since %04d-%02d-%02d in the %s calendar gave error %s\n",
days_since, year, month, day, calendar_name, ccs_err_str(ierr));
else
printf( "%d days since %04d-%02d-%02d in the %s calendar is %04d-%02d-%02d\n",
days_since, year, month, day, calendar_name, tyear, tmonth, tday );
/* Free the calendar */
ccs_free_calendar( cal );
printf( "\n" );
}
/*=======================================================================*/
int main( int argc, char *argv[] )
{
do_tests( "Standard", 2010, 1, 6 ); /* Day I'm writing this */
do_tests( "Standard", 1858, 11, 16); /* Wikipedia: Jul Day # 2,400,000 */
do_tests( "Standard", 2132, 8, 31); /* Wikipedia: Jul Day # 2,500,000 */
/* Try some dates around the calendar transition dates for fun */
do_tests( "Standard", 1582, 10, 4 ); /* Day before transition in Std cal */
do_tests( "Standard", 1582, 10, 15 ); /* Day after transition in Std cal */
do_tests( "Standard", 1582, 10, 9 ); /* Day DOES NOT EXIST in Std cal, should give errors */
return(0);
}
|