2010-07-24 91 views
3

我想找到一種方法來從去年匹配日期的日期,獲取去年當天的當天日期嗎?

因此,例如今天是7月的第四個星期五,同樣的日期會是去年?

我正在從一家餐廳獲得銷售額,我需要在同一天針對去年的銷售額進行覈對。

+4

那麼,第四個星期五在去年七月是一個不同的日期,這樣你就不會總是能夠回答它因爲有時會有第5個一個月的日子(今年10月的星期五)並不總是在那裏(明年10月)。 – 2010-07-24 01:22:29

+1

另外,你將不得不處理邊緣案例的閏年... – TheCloudlessSky 2010-07-24 01:23:56

+0

也許DateTime.Now.AddYears(-1)將不得不做... – 2010-07-24 01:30:06

回答

3

如上所述,問題沒有答案,因爲月份開始於不同年份的不同日子(更不用說閏年併發症)。

僅僅減去364天就足夠了,這正好是52周,所以你最終得到的是同一個星期的日子?

+0

這會工作我會認爲除了閏年,任何方式在這裏考慮到這些? – 2010-07-24 01:36:12

+0

然後檢查星期幾是否一致。因爲閏年會將這一計算推遲一天。如果一週中的某天不同,則再減去一天。 – 2010-07-24 01:40:09

+0

不,他們不會。 52周恰好是52周。現在,朱利安日期將會有兩種不同,而不是一種不同,但這仍然是一週中同一天最接近一年前的事件。 – 2010-07-24 02:30:09

0
DateTime now = DateTime.Now.Date; 
DateTime sameDayLastYear = new DateTime(now.Year - 1, now.Month, now.Day); 

當您嘗試設置時間爲2011年2月29日

DateTime leapDay = new DateTime(2012, 2, 29); 
DateTime sameleapDayLastYear = new DateTime(leapDay.Year - 1, leapDay.Month, leapDay.Day); 
+0

雖然這將獲得當月的相同數字,但它不會像Iggy要求的那樣獲得第n個<週一,週二,週三,週四,週五,週六,日>天。 – 2010-07-24 01:37:57

+0

是的,我誤解了他想做的事情。我的壞 – mdenomy 2010-07-25 14:18:15

1

如果你正在尋找你會遇到一個閏年,即下面的代碼中的問題會拋出異常對於是在一年內每月的第N特定工作日,這個代碼可以幫助:

using System; 

class NthWeekDayOfMonth 
{ 
    public 
    NthWeekDayOfMonth(DateTime date) 
    { 
     this.date = date; 
    } 

    public 
    NthWeekDayOfMonth(int n, DayOfWeek weekDay, int month, int year) 
    { 
     DateTime firstDayOfMonth = new DateTime(year, month, 1); 
     if (weekDay < firstDayOfMonth.DayOfWeek) 
     { 
      this.date = firstDayOfMonth.AddDays((n - 1) * 7 + weekDay + 7 - firstDayOfMonth.DayOfWeek); 
     } 
     else 
     { 
      this.date = firstDayOfMonth.AddDays((n - 1) * 7 + weekDay - firstDayOfMonth.DayOfWeek); 
     } 
    } 

    public int 
    Month 
    { 
     get { return date.Month; } 
    } 

    public DayOfWeek 
    WeekDay 
    { 
     get { return date.DayOfWeek; } 
    } 

    public int 
    N 
    { 
     get { return (date.Day - 1)/7 + 1; } 
    } 

    public int 
    Year 
    { 
     get { return date.Year; } 
    } 

    public DateTime 
    Date 
    { 
     get { return date; } 
    } 

    private DateTime 
    date; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     for (DateTime d = new DateTime(2010, 7, 1); d <= new DateTime(2010, 7, 31); d = d.AddDays(1)) 
     { 
      NthWeekDayOfMonth thisYear = new NthWeekDayOfMonth(d); 
      NthWeekDayOfMonth lastYear = new NthWeekDayOfMonth(thisYear.N, thisYear.WeekDay, thisYear.Month, thisYear.Year - 1); 
      Console.WriteLine("{0}th {1} of {2} in {3}: {4} - in {5}: {6}", thisYear.N, thisYear.WeekDay, thisYear.Month, thisYear.Year, thisYear.Date, lastYear.Year, lastYear.Date); 
     } 
    } 
} 
+0

這是有益的,感謝分享 – Justin 2014-06-28 02:06:17

+0

嗨,你能解決你的代碼? 1/6/2017 => 1/1/2016 ... 1/7/2017 => 1/2/2016 ...然後來一個巨大的SKIP 1/8/2017 => 1/10/2016(正確)。更新以查看整個2017年1月,並且您可以看到該錯誤。謝謝 – 2017-01-10 16:50:58

+0

沒有錯誤; 「巨大的SKIP」是正確的。 2017年1月7日是2017年1月的第一個星期六。2016年1月的第一個星期六是2016年1月2日。 2017年1月8日是2017年1月的第二個星期日。2016年1月的第二個星期日是1月10日。 – GBegen 2017-03-21 23:46:09