Index: /trunk/psLib/src/astro/psTime.c
===================================================================
--- /trunk/psLib/src/astro/psTime.c	(revision 1255)
+++ /trunk/psLib/src/astro/psTime.c	(revision 1256)
@@ -6,12 +6,12 @@
  *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
  *  of conversions between specific time formats.  PSLib currently uses the UNIX timeval time system as the
- *  base upon which International Atomic Time (TAI) time is calculated. All time conversion functions within
- *  psLib, except those noted, are calculated in terms of TAI time, which is approxinmately 32 seconds faster
- *  than UTC/timeval.
+ *  base upon which International Atomic Time (TAI) time is calculated. TAI time varies over time due to the
+ *  earth's rotation and the movement of the continental plates. It is currentls 32 seconds faster than
+ *  UTC/timeval time.
  *
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 01:56:28 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 01:02:53 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -153,5 +153,5 @@
 
     // Add most current leapseconds value to UTC time to get TAI time
-    time.tv_sec += leapseconds[NUM_LEAPSECOND_UPDATES][1];
+    time.tv_sec += leapseconds[NUM_LEAPSECOND_UPDATES-1][1];
 
     return time;
@@ -280,25 +280,30 @@
     }
 
-    month = atoi(strtok(tempString, "/"));
+    month = atoi(strtok(NULL, "/"));
     if(month<1 || month>12) {
         psError(__func__,"Month must have a value from 0 to 11. Value: %d", month);
     }
 
-    day = atoi(strtok(tempString, ","));
+    day = atoi(strtok(NULL, ","));
     if(day<1 || day>31) {
         psError(__func__,"Day must have a value from 1 to 31. Value: %d", day);
     }
 
-    hour = atoi(strtok(tempString, ":"));
+    hour = atoi(strtok(NULL, ":"));
     if(hour<0 || hour>23) {
         psError(__func__,"Hour must have a value from 0 to 23. Value: %d", hour);
     }
 
-    second = atoi(strtok(tempString, "."));
-    if(second<0 || second>60) {
+    minute = atoi(strtok(NULL, ":"));
+    if(minute<0 || minute>59) {
+        psError(__func__,"Minute must have a value from 0 to 59. Value: %d", minute);
+    }
+
+    second = atoi(strtok(NULL, "."));
+    if(second<0 || second>59) {
         psError(__func__,"Second must have a value from 0 to 59. Value: %d", second);
     }
 
-    millisecond = atoi(strtok(tempString, "X"));
+    millisecond = atoi(strtok(NULL, "X"));
     if(millisecond<0 || millisecond>1000) {
         psError(__func__,"Second must have a value from 0 to 999. Value: %d", millisecond);
@@ -311,4 +316,5 @@
     tmTime.tm_min = minute;
     tmTime.tm_sec = second;
+    tmTime.tm_isdst = -1;
 
     // Convert tm time to psTime
@@ -326,10 +332,9 @@
 
     // Convert UTC time to psTime/TAI
-    outTime.tv_sec = time.tv_sec + leapseconds[NUM_LEAPSECOND_UPDATES][1];
-    ;
+    outTime.tv_sec = time.tv_sec + leapseconds[NUM_LEAPSECOND_UPDATES-1][1];
     outTime.tv_usec = time.tv_usec;
     CHECK_NEGATIVE_TIME_STRUCT(outTime,outTime);
 
-    return time;
+    return outTime;
 }
 
@@ -406,5 +411,4 @@
 {
     int i;
-    int m;
     int n;
     int y;
@@ -414,5 +418,4 @@
 
     i= 0;
-    m = 0;
     n = 0;
     y = 0;
@@ -429,4 +432,5 @@
     }
 
+    // Back to 1969
     n = time->tm_year + 1900 - 1;
     epoch = (time->tm_year - 70) * SEC_PER_YEAR + ((n/4 - n/100 + n/400) -
@@ -435,23 +439,23 @@
     y = time->tm_year + 1900;
 
-    for(i = 0; i < time->tm_mon; i++)
-    {
-        epoch += mon [m] * SEC_PER_DAY;
-        if(m == 1 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
+    // Adjust for leap years
+    for(i = 0; i<time->tm_mon; i++)
+    {
+        epoch += mon [i] * SEC_PER_DAY;
+        if(i == 1 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
             epoch += SEC_PER_DAY;
         }
-
-        if(++m > 11) {
-            m = 0;
-            y++;
-        }
-    }
-
+    }
+
+    // Add everything
     epoch += (time->tm_mday - 1) * SEC_PER_DAY;
     epoch += time->tm_hour *SEC_PER_HOUR + time->tm_min * SEC_PER_MINUTE + time->tm_sec;
 
+    // Create psTime
     outTime.tv_usec = 0;
     outTime.tv_sec = epoch;
 
-    return outTime;
-}
+    CHECK_NEGATIVE_TIME_STRUCT(outTime,outTime);
+
+    return outTime;
+}
Index: /trunk/psLib/src/astro/psTime.h
===================================================================
--- /trunk/psLib/src/astro/psTime.h	(revision 1255)
+++ /trunk/psLib/src/astro/psTime.h	(revision 1256)
@@ -12,6 +12,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 01:29:22 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 01:03:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -41,14 +41,14 @@
 
 /** Seconds per minute */
-#define  SEC_PER_MINUTE   60
+#define  SEC_PER_MINUTE 60.0
 
 /** Seconds per hour */
-#define  SEC_PER_HOUR     60*SEC_PER_MINUTE
+#define  SEC_PER_HOUR (60.0*SEC_PER_MINUTE)
 
 /** Seconds per day */
-#define  SEC_PER_DAY      24*SEC_PER_HOUR
+#define  SEC_PER_DAY (24.0*SEC_PER_HOUR)
 
 /** Seconds per year */
-#define  SEC_PER_YEAR    365*SEC_PER_DAY
+#define  SEC_PER_YEAR (365.0*SEC_PER_DAY)
 
 /** Microseconds per day */
Index: /trunk/psLib/src/astronomy/psTime.c
===================================================================
--- /trunk/psLib/src/astronomy/psTime.c	(revision 1255)
+++ /trunk/psLib/src/astronomy/psTime.c	(revision 1256)
@@ -6,12 +6,12 @@
  *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
  *  of conversions between specific time formats.  PSLib currently uses the UNIX timeval time system as the
- *  base upon which International Atomic Time (TAI) time is calculated. All time conversion functions within
- *  psLib, except those noted, are calculated in terms of TAI time, which is approxinmately 32 seconds faster
- *  than UTC/timeval.
+ *  base upon which International Atomic Time (TAI) time is calculated. TAI time varies over time due to the
+ *  earth's rotation and the movement of the continental plates. It is currentls 32 seconds faster than
+ *  UTC/timeval time.
  *
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 01:56:28 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 01:02:53 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -153,5 +153,5 @@
 
     // Add most current leapseconds value to UTC time to get TAI time
-    time.tv_sec += leapseconds[NUM_LEAPSECOND_UPDATES][1];
+    time.tv_sec += leapseconds[NUM_LEAPSECOND_UPDATES-1][1];
 
     return time;
@@ -280,25 +280,30 @@
     }
 
-    month = atoi(strtok(tempString, "/"));
+    month = atoi(strtok(NULL, "/"));
     if(month<1 || month>12) {
         psError(__func__,"Month must have a value from 0 to 11. Value: %d", month);
     }
 
-    day = atoi(strtok(tempString, ","));
+    day = atoi(strtok(NULL, ","));
     if(day<1 || day>31) {
         psError(__func__,"Day must have a value from 1 to 31. Value: %d", day);
     }
 
-    hour = atoi(strtok(tempString, ":"));
+    hour = atoi(strtok(NULL, ":"));
     if(hour<0 || hour>23) {
         psError(__func__,"Hour must have a value from 0 to 23. Value: %d", hour);
     }
 
-    second = atoi(strtok(tempString, "."));
-    if(second<0 || second>60) {
+    minute = atoi(strtok(NULL, ":"));
+    if(minute<0 || minute>59) {
+        psError(__func__,"Minute must have a value from 0 to 59. Value: %d", minute);
+    }
+
+    second = atoi(strtok(NULL, "."));
+    if(second<0 || second>59) {
         psError(__func__,"Second must have a value from 0 to 59. Value: %d", second);
     }
 
-    millisecond = atoi(strtok(tempString, "X"));
+    millisecond = atoi(strtok(NULL, "X"));
     if(millisecond<0 || millisecond>1000) {
         psError(__func__,"Second must have a value from 0 to 999. Value: %d", millisecond);
@@ -311,4 +316,5 @@
     tmTime.tm_min = minute;
     tmTime.tm_sec = second;
+    tmTime.tm_isdst = -1;
 
     // Convert tm time to psTime
@@ -326,10 +332,9 @@
 
     // Convert UTC time to psTime/TAI
-    outTime.tv_sec = time.tv_sec + leapseconds[NUM_LEAPSECOND_UPDATES][1];
-    ;
+    outTime.tv_sec = time.tv_sec + leapseconds[NUM_LEAPSECOND_UPDATES-1][1];
     outTime.tv_usec = time.tv_usec;
     CHECK_NEGATIVE_TIME_STRUCT(outTime,outTime);
 
-    return time;
+    return outTime;
 }
 
@@ -406,5 +411,4 @@
 {
     int i;
-    int m;
     int n;
     int y;
@@ -414,5 +418,4 @@
 
     i= 0;
-    m = 0;
     n = 0;
     y = 0;
@@ -429,4 +432,5 @@
     }
 
+    // Back to 1969
     n = time->tm_year + 1900 - 1;
     epoch = (time->tm_year - 70) * SEC_PER_YEAR + ((n/4 - n/100 + n/400) -
@@ -435,23 +439,23 @@
     y = time->tm_year + 1900;
 
-    for(i = 0; i < time->tm_mon; i++)
-    {
-        epoch += mon [m] * SEC_PER_DAY;
-        if(m == 1 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
+    // Adjust for leap years
+    for(i = 0; i<time->tm_mon; i++)
+    {
+        epoch += mon [i] * SEC_PER_DAY;
+        if(i == 1 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) {
             epoch += SEC_PER_DAY;
         }
-
-        if(++m > 11) {
-            m = 0;
-            y++;
-        }
-    }
-
+    }
+
+    // Add everything
     epoch += (time->tm_mday - 1) * SEC_PER_DAY;
     epoch += time->tm_hour *SEC_PER_HOUR + time->tm_min * SEC_PER_MINUTE + time->tm_sec;
 
+    // Create psTime
     outTime.tv_usec = 0;
     outTime.tv_sec = epoch;
 
-    return outTime;
-}
+    CHECK_NEGATIVE_TIME_STRUCT(outTime,outTime);
+
+    return outTime;
+}
Index: /trunk/psLib/src/astronomy/psTime.h
===================================================================
--- /trunk/psLib/src/astronomy/psTime.h	(revision 1255)
+++ /trunk/psLib/src/astronomy/psTime.h	(revision 1256)
@@ -12,6 +12,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-07-21 01:29:22 $
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-22 01:03:00 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -41,14 +41,14 @@
 
 /** Seconds per minute */
-#define  SEC_PER_MINUTE   60
+#define  SEC_PER_MINUTE 60.0
 
 /** Seconds per hour */
-#define  SEC_PER_HOUR     60*SEC_PER_MINUTE
+#define  SEC_PER_HOUR (60.0*SEC_PER_MINUTE)
 
 /** Seconds per day */
-#define  SEC_PER_DAY      24*SEC_PER_HOUR
+#define  SEC_PER_DAY (24.0*SEC_PER_HOUR)
 
 /** Seconds per year */
-#define  SEC_PER_YEAR    365*SEC_PER_DAY
+#define  SEC_PER_YEAR (365.0*SEC_PER_DAY)
 
 /** Microseconds per day */
Index: /trunk/psLib/test/astronomy/tst_psTime_01.c
===================================================================
--- /trunk/psLib/test/astronomy/tst_psTime_01.c	(revision 1255)
+++ /trunk/psLib/test/astronomy/tst_psTime_01.c	(revision 1256)
@@ -4,19 +4,23 @@
  *
  *  This test driver contains the following tests for psTime:
- *     A)  
- *     B)  
- *     C)  
- *     D)  
- *     E)  
- *     F)  
- *     G)  
- *     H)  
- *     I)  
- *     J)  
+ *     A) Get current TAI time
+ *     B) Print test time
+ *     C) Convert psTime to ISO time
+ *     D) Convert ISO time to psTime
+ *     E) Convert psTime to UTC time
+ *     F) Convert UTC time to psTime
+ *     G) Convert psTime to MJD time
+ *     H) Convert MJD time to psTime
+ *     I) Convert psTime to JD time
+ *     J) Convert JD time to psTime
+ *     K) Convert psTime to timeval time
+ *     L) Convert timeval time to psTime
+ *     M) Convert psTime to tm time
+ *     N) Convert tm time to psTime
  *
  *  @author  Ross Harman, MHPCC
  *
- *  @version $Revision: 1.1 $  $Name: not supported by cvs2svn $
- *  @date  $Date: 2004-07-15 19:00:29 $
+ *  @version $Revision: 1.2 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2004-07-22 01:03:18 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -29,5 +33,119 @@
 int main(int argc, char* argv[])
 {
+    psTime time;
+    psTime testTime;
 
+    // Test time was taken at July 21, 2004 at 18:22:24.272044
+    testTime.tv_sec = 1090434144;
+    testTime.tv_usec = 272044;
+
+
+    // Test A - Get current TAI time
+    printPositiveTestHeader(stdout,"psTime", "Get current TAI time");
+    time = psTimeGetTime();
+    printFooter(stdout, "psTime", "Get current TAI time", true);
+
+
+    //Test B - Print test time
+    printPositiveTestHeader(stdout,"psTime", "Print test time");
+    printf("Test time: July 21, 2004 at 18:22:24.272044\n");
+    printf("Test time: Seconds = %ld Microseconds = %ld\n", (long)testTime.tv_sec, (long)testTime.tv_usec);
+    printFooter(stdout, "psTime", "Print test time", true);
+
+
+    // Test C - Convert psTime to ISO time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to ISO time");
+    char *isoString;
+    isoString = psTimeToISO(testTime);
+    printf("ISO = %s\n", isoString);
+    printFooter(stdout, "psTime", "Convert psTime to ISO time", true);
+
+
+    // Test D - Convert ISO time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert ISO time to psTime");
+    time = psISOToTime(isoString);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    psFree(isoString);
+    printFooter(stdout, "psTime", "Convert ISO time to psTime", true);
+
+
+    // Test E - Convert psTime to UTC time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime time to UTC time");
+    time = psTimeToUTC(testTime);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert psTime time to UTC time", true);
+
+
+    // Test F - Convert UTC time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert UTC time to psTime");
+    time = psUTCToTime(time);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert UTC time to psTime", true);
+
+
+    // Test G - Convert psTime to MJD time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to MJD time");
+    double mjdTime = 0.0;
+    mjdTime = psTimeToMJD(testTime);
+    printf("MJD = %f\n", mjdTime);
+    printFooter(stdout, "psTime", "Convert psTime to MJD time", true);
+
+
+    // Test H - Convert MJD time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert MJD time to psTime");
+    time = psMJDToTime(mjdTime);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert MJD time to psTime", true);
+
+
+    // Test I - Convert psTime to JD time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to JD time");
+    double jdTime = 0.0;
+    jdTime = psTimeToJD(testTime);
+    printf("JD = %f\n", jdTime);
+    printFooter(stdout, "psTime", "Convert psTime to JD time", true);
+
+
+    // Test J - Convert JD time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert JD time to psTime");
+    time = psJDToTime(jdTime);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert JD time to psTime", true);
+
+
+    // Test K - Convert psTime to timeval time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to timeval time");
+    struct timeval timevalTime;
+    timevalTime = psTimeToTimeval(testTime);
+    printf("timevalTime: Seconds = %ld Microseconds = %ld\n", (long)timevalTime.tv_sec, (long)timevalTime.tv_usec);
+    printFooter(stdout, "psTime", "Convert psTime to timeval time", true);
+
+
+    // Test L - Convert timeval time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert timeval time to psTime");
+    time = psTimevalToTime(&timevalTime);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert timeval time to psTime", true);
+
+
+    // Test M - Convert psTime to tm time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to tm time");
+    struct tm *tmTime;
+    tmTime = psTimeToTM(testTime);
+    printf("tmTime:\n");
+    printf("tmTime->tm_year = %d\n", tmTime->tm_year);
+    printf("tmTime->tm_mon = %d\n", tmTime->tm_mon);
+    printf("tmTime->tm_mday = %d\n", tmTime->tm_mday);
+    printf("tmTime->tm_hour = %d\n", tmTime->tm_hour);
+    printf("tmTime->tm_min = %d\n", tmTime->tm_min);
+    printf("tmTime->tm_sec = %d\n", tmTime->tm_sec);
+    printFooter(stdout, "psTime", "Convert psTime to tm time", true);
+
+
+    // Test N - Convert tm time to psTime
+    printPositiveTestHeader(stdout, "psTime", "Convert tm time to psTime");
+    time = psTMToTime(tmTime);
+    printf("psTime: Seconds = %ld Microseconds = %ld\n", (long)time.tv_sec, (long)time.tv_usec);
+    printFooter(stdout, "psTime", "Convert tm time to psTime", true);
 
     return 0;
