1 /*
2   This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data.
3 
4   Author: Uwe Schulzweida
5 
6 */
7 
8 #include <cdi.h>
9 
10 #include "datetime.h"
11 #include "calendar.h"
12 #include "timebase.h"
13 
14 JulianDate
juldate_encode(int calendar,int64_t date,int time)15 juldate_encode(int calendar, int64_t date, int time)
16 {
17   int year, month, day, hour, minute, second;
18   cdiDecodeDate(date, &year, &month, &day);
19   cdiDecodeTime(time, &hour, &minute, &second);
20 
21   JulianDate juldate;
22   encode_caldaysec(calendar, year, month, day, hour, minute, second, &juldate.julday, &juldate.secofday);
23 
24   return juldate;
25 }
26 
27 void
juldate_decode(int calendar,const JulianDate & juldate,int64_t & date,int & time)28 juldate_decode(int calendar, const JulianDate &juldate, int64_t &date, int &time)
29 {
30   int year, month, day, hour, minute, second;
31   decode_caldaysec(calendar, juldate.julday, juldate.secofday, &year, &month, &day, &hour, &minute, &second);
32 
33   date = cdiEncodeDate(year, month, day);
34   time = cdiEncodeTime(hour, minute, second);
35 }
36 
37 JulianDate
juldate_sub(const JulianDate & juldate2,const JulianDate & juldate1)38 juldate_sub(const JulianDate &juldate2, const JulianDate &juldate1)
39 {
40   JulianDate juldate;
41 
42   (void) julday_sub(juldate1.julday, juldate1.secofday, juldate2.julday, juldate2.secofday, &juldate.julday, &juldate.secofday);
43 
44   return juldate;
45 }
46 
47 JulianDate
juldate_add_seconds(int64_t seconds,const JulianDate & juldate)48 juldate_add_seconds(int64_t seconds, const JulianDate &juldate)
49 {
50   JulianDate juldate_new = juldate;
51 
52   julday_add_seconds(seconds, &juldate_new.julday, &juldate_new.secofday);
53 
54   return juldate_new;
55 }
56 
57 double
juldate_to_seconds(const JulianDate & juldate)58 juldate_to_seconds(const JulianDate &juldate)
59 {
60   return juldate.julday * 86400. + juldate.secofday;
61 }
62