diff options
-rw-r--r-- | core/subsurface-time.h | 2 | ||||
-rw-r--r-- | core/time.c | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/core/subsurface-time.h b/core/subsurface-time.h index 38d6c10de..ce2821d07 100644 --- a/core/subsurface-time.h +++ b/core/subsurface-time.h @@ -11,6 +11,8 @@ extern "C" { extern timestamp_t utc_mktime(struct tm *tm); extern void utc_mkdate(timestamp_t, struct tm *tm); +extern int utc_year(timestamp_t timestamp); +extern int utc_weekday(timestamp_t timestamp); #ifdef __cplusplus } diff --git a/core/time.c b/core/time.c index d339ffa30..94149342a 100644 --- a/core/time.c +++ b/core/time.c @@ -133,3 +133,33 @@ timestamp_t utc_mktime(struct tm *tm) return when - EPOCH_OFFSET; } + +/* + * Extract year from 64-bit timestamp. + * + * This looks inefficient, since it breaks down into a full + * struct tm. However, modern compilers are effective at throwing + * out unused calculations. If it turns out to be a bottle neck + * we will have to cache a struct tm per dive. + */ +int utc_year(timestamp_t timestamp) +{ + struct tm tm; + utc_mkdate(timestamp, &tm); + return tm.tm_year; +} + +/* + * Extract day of week from 64-bit timestamp. + * Returns 0-6, whereby 0 is Sunday and 6 is Saturday. + * + * Same comment as for utc_year(): Modern compilers are good + * at throwing out unused calculations, so this is more efficient + * than it looks. + */ +int utc_weekday(timestamp_t timestamp) +{ + struct tm tm; + utc_mkdate(timestamp, &tm); + return tm.tm_wday; +} |