簡體   English   中英

如何將日歷周轉換為 Excel 中的日期?

[英]How do I convert a calendar week into a date in Excel?

我有一個周數和一年,並且想在 Microsoft Excel 中計算該特定周的星期一的日期。

Year   Week   Date (Monday)
2012   1      January 2, 2012
2013   16     April 15, 2013
2014   42     October 13, 2014

我可以使用什么公式將日歷周轉換為特定日期?

對於 ISO 周數,您可以使用此公式獲得星期一

=DATE(A2,1,-2)-WEEKDAY(DATE(A2,1,3))+B2*7

假設 A2 中的年份和 B2 中的周數

這與我在這里的回答相同https://stackoverflow.com/a/10855872/1124287

以下公式適用於每一年。 你不需要再調整它了。 前提是星期一是您一周的第一天。

If A2 = Year and Week = B2
=IF(ISOWEEKNUM(DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)+1)>1;DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)+1+B2*7;DATE($A$2;1;1)-WEEKDAY(DATE($A$2;1;1);2)-6+B2*7)

如果您的周數在 A1 中,年份在 A2 中,則以下代碼段可以為您提供整周的日期

=$A$1*7+DATE($B$1,1,-4) through =$A$1*7+DATE($B$1,1,2)

當然,完成從 -4 到 2 的系列,您將有從周日到周六開始的約會。

希望這可以幫助。

如果周數在A1 ,年份在A2 ,您可以嘗試:

A1*7+DATE(A2,1,1)

一個簡單的解決方案是做這個公式:

A1*7+DATE(A2,1,1)

如果它返回星期三,只需將公式更改為:

(A1*7+DATE(A2,1,1))-2

這僅適用於一個日歷年內的日期。

如果 A1 的周數和年份為 wwYY 格式的 3 位或 4 位整數,則公式為:

=INT(A1/100)*7+DATE(MOD([A1,100),1,1)-WEEKDAY(DATE(MOD(A1,100),1,1))-5

減去工作日可確保您返回一周的一致開始日。 使用最后的減法來調整開始日期。

=(MOD(R[-1]C-1,100)*7+DATE(INT(R[-1]C/100+2000),1,1)-2)

yyww 作為給定的周 exp:week 51 year 2014 將是 1451

如果您正在尋找相反的方法來從周數中獲取日期,我在網上找到了一個解決方案並對其稍作更改:

Function fnDateFromWeek(iYear As Integer, iWeek As Integer, iWeekDday As Integer)
  ' get the date from a certain day in a certain week in a certain year
  fnDateFromWeek = DateSerial(iYear, 1, (iWeek * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
End Function

從 asap-utilities.com/ 獲取公式並進行了更改

DateSerial(iYear, 1, ((iWeek - 1) * 7) 

DateSerial(iYear, 1, (iWeek * 7)

更新

似乎至少對德國而言, 2016 年閏年的公式沒有按預期工作,所以我將其更改為

Function fnDateFromWeek(iYear As Integer, iWeek As Integer, iWeekDday As Integer)
' get the date from a certain day in a certain week in a certain year
  
    If isLeapYear(iYear) Then
        curDate = DateSerial(iYear, 1, ((iWeek) * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
    Else
        curDate = DateSerial(iYear, 1, ((iWeek - 1) * 7) _
          + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
    End If
    fnDateFromWeek = curDate
End Function

由於 2016 年硬編碼並不理想,您可以使用此功能檢查一年是否為閏年

Function isLeapYear(iYear As Integer) As Boolean

    If (Month(DateSerial(iYear, 2, 29)) = 2) Then
        isLeapYear = True
    Else
        isLeapYear = False
    End If
    
End Function

對於非閏年DateSerial(iYear,2 ,29)返回 3 DateSerial(iYear,2 ,29) 1 日

這可能仍然是錯誤的,但我有限的測試給出了預期的結果:

Sub TestExample()
   Debug.Print Format(fnDateFromWeek(2014, 48, 2), "ddd dd mmm yyyy") ' mo 24 Nov 2014
   Debug.Print Format(fnDateFromWeek(2015, 11, 6), "ddd dd-mmm-yyyy") ' fr 13 Mar 2015
   Debug.Print Format(fnDateFromWeek(2016, 36, 2), "ddd dd-mmm-yyyy") ' Mo 05 Sep 2015
End Sub

抱歉,我能理解的解決方案均未給出正確的結果。 在某些情況下,一周的開始是在實際日期之后。 即,星期日的一周的開始日期是下一個星期一。 周初錯誤

如果有人可以糾正我的想法,我將不勝感激。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM