2010-10-30 163 views
2

我有一個整數的當前一週(43現在)。 我需要星期一的日期,格式爲'Mon Oct 25'。獲得給定周的第一天

想到我可以通過一個函數來實現,但我不知道該怎麼做。 有什麼建議嗎?

編輯: 我試過R.的建議,但它沒有給出預期的結果。我執行錯了嗎?

time_t monday; 
char date_format[32]; 
time_t now = time(NULL); 
struct tm *tm = localtime(&now); 

tm->tm_yday = 0; // reset to Jan 1st 
tm->tm_hour = 24 * 7 * WEEK + 24; // goto Sun and add 24h for Mon 

monday = mktime(tm); 

strftime(date_format, 31, "%a : %D", tm); 

printf("%s\n", date_format); 
+2

祝你好運。 ISO-8601定義了「星期編號」的含義(即,如何確定第1周第1天的日期,具體取決於該年開始的一週中的哪一天)。具體而言,第1周是包含該年第一個星期四的任何一週。但不是每個人都一致使用這個定義。所以在你編寫任何代碼之前,你必須知道輸入的實際含義。 – 2010-10-30 17:39:58

+0

可用解決方案取決於您的環境。 – 2010-10-30 17:40:25

+0

還記得,這個答案會根據它的年份而改變。 – 2010-10-30 17:45:36

回答

2

注:沒有測試,但考慮到目前的一年,這應該這樣做:

const char *months[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep", 
         "Oct","Nov","dec","Jan"}; 
/* Start with January 1st of the current year */ 
struct tm curYear={ 
    0, // secs 
    0, // mins 
    0, // hours 
    1, // Day of month 
    0, // Month (Jan) 
    year, 
    0, // wday 
    0, // yday 
    0}; // isdst 

/* Offset the number of weeks specified */ 
time_t secsSinceEpoch=mktime(&curYear)+ 
         weekNum*86400*7; /* Shift by number of weeks */ 
struct tm *candidateDate=gmtime(&secsSinceEpoch); 

/* If the candidate date is not a Monday, shift it so that it is */ 
if (candidateDate->tm_wday!=1) 
{ 
    secsSinceEpoch+=(86400*(candidateDate->tm_wday-1)); 
    candidateDate=gmtime(&secsSinceEpoch); 
} 

printf("Mon %s %d",months[candidateDate->tm_mon],candidateDate->tm_mday\n"); 

您可能取決於究竟你的意思是43周調整公式驗證碼例如,給定的一年或符合ISO-8601。但是,這應該爲您提供良好的鍋爐板代碼來開始。您可能還想參數化一週中的某一天,以便它不會被硬編碼。

此外,如果您願意,可以通過截斷ctime函數的結果來避開月份數組,並且必須格式化該函數,該函數的結果恰好顯示得比您要求的要多。您會傳遞一個指向secsSinceEpoch值的指針,並截斷其輸出以僅顯示星期幾,月份的日期和月份名稱的縮寫。

+1

你讓它太難了。看到我的答案。 – 2010-10-30 18:03:34

+0

在這裏使用strftime()有什麼問題? – Clifford 2010-10-30 18:43:04

+0

你真的很擅長編寫代碼而不測試它:)我只需要將數組長度更改爲13,並將星期數減1。然後我得到'10月25日星期一',這是絕對正確的。 – ClosedID 2010-10-30 20:07:03

2

mktime函數可以做到這一點。只需初始化struct tm foo以表示一年中的第一天(或根據需要表示第一週的第一天),然後將tm_hour設置爲24*7*weeknum並呼叫mktime。它會使你的日期正常化。

+0

此行爲編譯器是特定的還是C標準的一部分? – 2010-10-30 18:27:46

+0

@Michael:標準說初始值可能超出範圍,並且它們被「強制」到範圍內。它沒有說明它們是如何被強制的(至少,不在C99的7.23.2.3/2中),所以你可能會爭論標準不需要它,但我認爲其意圖是時間溢出計算完成。 @R。您是否必須將時間設置爲第一天的午間時間(而不是午夜時間),以避免由於夏令時而出現一天? – 2010-10-30 20:23:36

+0

這是一個漂亮的解決方案,但我無法按預期工作。我將建議的代碼添加到了我原來的帖子中。它打印本週的「Sun:08/28/11」。有人看到錯誤? – ClosedID 2010-10-30 20:37:19

相關問題