C: Юлианская дневная библиотека - Как я могу получить дату (т. Е. Гггг / мм / дд) из смещения даты (количество дней после X)? - PullRequest
1 голос
/ 08 декабря 2010

Я ищу способ в C определить дату по смещению даты (т.е. количество дней с 31 декабря 1899 г.). Например, void get_date(const struct date start_date, int offset);. По сути, простая библиотека со структурой date (но без поддержки времени). Он должен обрабатывать високосные годы и специфические для даты вещи, но ничего не связано со временем (например, високосные секунды и другие осложнения).

struct date start_date = {
    .date_day = 31,    // 31
    .date_month = 12,  // December
    .date_year = 1899, // 1899
};

/* From and including: December 31, 1899
 * To, but not including : December 8, 2010
 * It's 40,519 days from the start date to the end date,
 * but not including the end date: [start_date, end_date)  */
get_date(start_date, 40519); // Prints something like "2010-12-08".

В идеале библиотека должна поддерживать юлианские дни , потенциально восходящие к эпохе 1 января 4713 г. до н.э.

1 Ответ

0 голосов
/ 08 декабря 2010

Вы можете сделать это со стандартным C (так как вам нужны только даты, вам не нужно беспокоиться о головных болях в часовых поясах, которые сопровождают эти функции). Это предполагает POSIX-определение time_t, но на AFAIK нет используемой в настоящее время ОС с другим определением.

#include <time.h>

/* before calling, memset() the 'struct tm' argument to 
   all-bits-zero, set tm_hour to 12, then fill in the
   tm_year, tm_mon, and tm_mday fields; on return, pay
   attention to those fields only. */
struct tm
add_days(const struct tm *base, long days)
{
    time_t t = mktime(base);
    t += 3600*24*days;

    return *localtime(&t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...