2010-12-08 15 views
1

私は、日付オフセット(つまり、1899年12月31日からの日数)から日付を決定する方法をCで探しています。たとえば、void get_date(const struct date start_date, int offset);となります。基本的に、date構造体を持つシンプルなライブラリです(ただし、時間のサポートはありません)。それはうるう年や日付特有のものを処理する必要がありますが、時間に関係するものはありません(例えば、うるう秒やその他の合併症)。C:ユリウス日ライブラリー - 日付オフセット(Xからの日数)から日付(つまり、yyyy/mm/dd)を取得するにはどうすればよいですか?

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月1日、4713 BCへ行く、Julian daysをサポートする必要があります。

答えて

0

標準Cでこれを行うことができます(日付のみを気にするので、これらの関数に付属するタイムゾーンの頭痛を心配する必要はありません)。これは、time_tのPOSIX定義を前提としていますが、AFAIKでは定義が異なる現在使用中のOSはありません。

#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); 
} 
+0

これは、1970年 – wallyk

+0

、それは確信して前の日付では動作しません。 POSIX time_tが署名されています。 – zwol

+0

'@Zack:' time_tはどこまで戻っていますか?私は1800年代にさかのぼる日付を持っています... – Galois

関連する問題