IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7700


Ignore:
Timestamp:
Jun 26, 2006, 5:45:25 PM (20 years ago)
Author:
jhoblitt
Message:

add psTimeToTM()
rename p_psTimeFromTM() -> psTimeFromTM()
minor formating changes

Location:
trunk/psLib/src/astro
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/astro/psTime.c

    r7608 r7700  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.86 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2006-06-21 17:46:06 $
     12 *  @version $Revision: 1.87 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2006-06-27 03:45:25 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    13261326    char *timeString = NULL;
    13271327    char *tempString = NULL;
    1328     struct tm *tmTime = NULL;
    1329     time_t sec;
    13301328
    13311329    // Error checks
     
    13421340    // Convert nanoseconds to decaseconds
    13431341    ds = time->nsec / 100000000;
    1344     sec = time->sec;
    1345 
    1346     // If leapsecond use previous day
    1347     if(time->leapsecond) {
    1348         sec--;
    1349     }
    13501342
    13511343    // tmTime variable is statically allocated, no need to free
    1352     tmTime = gmtime(&sec);
     1344    struct tm *tmTime = psTimeToTM(time);
    13531345
    13541346    // Converts psTime to YYYY-MM-DDThh:mm:ss.sss in string form
     
    13561348        psError(PS_ERR_OS_CALL_FAILED, true, PS_ERRORTEXT_psTime_CONVERT_TIME_TO_STRING_FAILED);
    13571349    }
     1350    psFree(tmTime);
    13581351
    13591352    // Check if time is UTC and leapsecond
     
    13731366}
    13741367
     1368struct tm *psTimeToTM(const psTime *time)
     1369{
     1370    PS_ASSERT_PTR_NON_NULL(time,NULL);
     1371
     1372    // XXX is it safe to assume that time_t is always an integer value?
     1373    time_t sec = time->sec;
     1374
     1375    // if this is NOT a UTC time then we want to make sure tm.tm_sec does not
     1376    // end up being set to 60
     1377    if (!time->type == PS_TIME_UTC)
     1378    {
     1379        // If leapsecond use previous day
     1380        if (time->leapsecond) {
     1381            sec--;
     1382        }
     1383    }
     1384
     1385    // struct tm can handle leapseconds
     1386    struct tm *tmTime = psAlloc(sizeof(struct tm));
     1387    gmtime_r(&sec, tmTime);
     1388
     1389    return tmTime;
     1390}
     1391
    13751392struct timeval* psTimeToTimeval(const psTime *time)
    13761393{
     
    13911408    return timevalTime;
    13921409}
    1393 
    1394 /*
    1395 struct tm* p_psTimeToTM(const psTime *time)
    1396 {
    1397     psS64 cent = 0;
    1398     psS64 year = 0;
    1399     psS64 month = 0;
    1400     psS64 day = 0;
    1401     psS64 hour = 0;
    1402     psS64 minute = 0;
    1403     psS64 seconds = 0;
    1404     psS64 temp = 0;
    1405     struct tm* tmTime = NULL;
    1406  
    1407  
    1408     // Error checks
    1409     PS_ASSERT_PTR_NON_NULL(time,NULL);
    1410     PS_ASSERT_INT_WITHIN_RANGE(time->nsec,0,(psU32)((1e9)-1),NULL);
    1411  
    1412     seconds = time->sec%60;
    1413     minute = time->sec/60%60;
    1414     hour = time->sec/3600%24;
    1415     day = (time->sec+62135596800)/86400;
    1416  
    1417     // Add 306 days to make relative to Mar 1, 0; also adjust day to be within a range (1..2**28-1) where our
    1418     // calculations will work with 32bit ints
    1419     if(day > (pow(2, 28)-307))
    1420     {
    1421         temp = (day - 146097+306)/146097+1;         // Avoid overflow if day close to maxint
    1422         day -= temp * 146097-306;
    1423     } else if((day += 306) <= 0)
    1424     {
    1425         temp = -( -day / 146097 + 1);               // Avoid ambiguity in C division of negatives
    1426         day -= temp * 146097;
    1427     }
    1428  
    1429     cent = (day*4-1)/146097;                        // Calc number of centuries day is after 29 Feb of yr 0
    1430     day -= cent*146097/4;                           // 4 centuries = 146097 days
    1431     year = (day*4-1)/1461;                          // Calc number of years into the century
    1432     day -= year*1461/4;                             // Again March-based (4 yrs =\u02dc 146[01] days)
    1433     month = (day*12+1093)/367;                      // Get the month (3..14 represent March through
    1434     day -= (month*367-1094)/12;                     // February of following year)
    1435     year += cent*100+temp*400;                      // Get the real year, which is off by
    1436  
    1437     // One if month is January or February
    1438     if(month > 12)
    1439     {
    1440         year++;
    1441         month -= 12;
    1442     }
    1443  
    1444     // Allocate output
    1445     tmTime = (struct tm*)psAlloc(sizeof(struct tm));
    1446  
    1447     tmTime->tm_year = year - 1900;
    1448     tmTime->tm_mon = month - 1;
    1449     tmTime->tm_mday = day + 1;
    1450     tmTime->tm_hour = hour;
    1451     tmTime->tm_min = minute;
    1452     tmTime->tm_sec = seconds;
    1453     tmTime->tm_isdst = -1;
    1454  
    1455     return tmTime;
    1456 }
    1457 */
    14581410
    14591411psTime* psTimeFromJD(double jd)
     
    15391491
    15401492    // Convert tm time to psTime
    1541     outTime = p_psTimeFromTM(&tmTime);
     1493    outTime = psTimeFromTM(&tmTime);
    15421494    outTime->nsec = millisecond * 1000000;
    15431495    //    outTime->type = type;
     
    16111563}
    16121564
    1613 psTime* p_psTimeFromTM(const struct tm* time)
     1565psTime* psTimeFromTM(const struct tm* time)
    16141566{
    16151567    psS64 year;
     
    16621614    // days to adjust from Mar 1, year 0-relative to Jan 1, year 1-relative. Add hours, minutes, and seconds.
    16631615    day += (month * 367 - 1094) / 12 + year % 100 * 1461 / 4 + (year/100 * 36524 + year/400) - 306;
    1664     outTime->sec = (((day - 1) * SEC_PER_DAY) - 62135596800) + hour*SEC_PER_HOUR
    1665                    + minute*SEC_PER_MINUTE + seconds;
     1616    //outTime->sec = (((day - 1) * SEC_PER_DAY) - 62135596800) + hour*SEC_PER_HOUR
     1617    outTime->sec = ((day - 1) * SEC_PER_DAY - 62135596800)
     1618                   + (hour * SEC_PER_HOUR)
     1619                   + (minute * SEC_PER_MINUTE)
     1620                   + seconds;
    16661621
    16671622    // C's TM does not define a microsecond field. Microseconds must be manipulated by calling function.
  • trunk/psLib/src/astro/psTime.h

    r6184 r7700  
    1111 *  @author Ross Harman, MHPCC
    1212 *
    13  *  @version $Revision: 1.45 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2006-01-23 20:04:31 $
     13 *  @version $Revision: 1.46 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2006-06-27 03:45:25 $
    1515 *
    1616 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    256256);
    257257
     258/** Convert psTime to struct tm time.
     259 *
     260 *  Converts psTime to struct tm time.  This function should handle
     261 *  UTC leapseconds correctly.
     262 *
     263 *  @return tm*:   tm struct.
     264 */
     265struct tm *psTimeToTM(
     266                const psTime* time     ///< Input time to be converted.
     267            );
     268
    258269/** Convert psTime to timeval time.
    259270 *
     
    351362 *  @return  psTime*: time.
    352363 */
    353 psTime* p_psTimeFromTM(
     364psTime* psTimeFromTM(
    354365    const struct tm *time              ///< Input time to be converted.
    355366);
Note: See TracChangeset for help on using the changeset viewer.