2013-08-05 80 views
1

給定日期我希望計算當前的年度季度。根據給定日期計算當前或下一個年度季度的第一個月和當前年度季度的最後一個月

如果今天的日期大於給定日期,我希望根據給定日期和下一個年度季度的第一個月計算當前每個季度的上個月。

與我一起經營的宿舍有jan-mar,apr-jun,jul-sep和oct-dec。

如果輸入的日期是2013年10月1日,我希望輸出爲1月(下一個年度季度的第一個月)和12月(當前年度季度的最後一個月)。在這種情況下,本月變量將包含值10和日變量將包含值1

我迄今爲止嘗試:

上個月每季度

if (month % 3 == 0) 
    month += (DateTime.Now.Day > day ? 3 : 0); 
if (month % 3 == 1) 
    month += 2; 
if (month % 3 == 2) 
    month += 1; 

每個第一個月quarter

if (month % 3 == 1) // jan/mapr/jul/oct 
    month += (DateTime.Now.Day > day ? 3 : 0); 
if (month % 3 == 2) // feb/may/aug/nov 
    month += 2; 
if (month % 3 == 0) // mar/jun/sep/dec 
    month += 1; 

回答

1

如前所述,這種算法提供您想要的功能:

int quarterCurr = 1; 
if (Convert.ToDouble(curMonth)/3.0 > 1.0) 
{ 
    quarterCurr = Convert.ToInt32(Convert.ToDouble(curMonth)/3.0); 
    if (curMonth % 3 != 0) 
    { 
     quarterCurr = quarterCurr + 1; 
    } 
} 
int firstMonthCurr = 3 * (quarterCurr - 1) + 1; 
int lastMonthCurr = 3 * quarterCurr; 

int quarterNext = quarterCurr + 1; 
if (quarterNext > 4) 
{ 
    quarterNext = 1; 
} 
int firstMonthNext = 3 * (quarterNext - 1) + 1; 

這是一個簡單的/清晰的方式來計算出你需要的所有信息:每個季度的第一個/最後一個月。

此代碼預計將被放入一個函數,將在需要時調用。它將以當前月份作爲輸入,並以輸出的形式返回一個長度爲2的一維數組:第一個位置爲當前季度的最後一個月,第二個位置爲第二個季度的第一個月(或任何其他選擇)。因此,主要功能(計算任何輸入月份的目標值)已包含在內,但您必須根據您的具體要求對其進行調整。

+1

見?一個奇蹟的例子:) – varocarbas

+0

你是一個救生員,從我得到的其他答案來看,我似乎已經澄清了我自己相當多的一次。謝謝! :D – Maritim

+1

@Maritim對於需要它的人來說沒有任何問題。 – varocarbas

4

您可以使用整數數學獲得當前季度。

int currentQuarter = ((month-1)/3)+1; 

這工作,因爲整數除法總是會截斷,所以如果月是1到3,你會得到0到2比3,這將等於0月4至6將給予3-5超過3,這將等於1等等。

對於給定的季度以來的首次上個月由下式給出:

int firstMonthOfQuarter = (quarter*3)-2; 

int lastMonthOfQuarter = (quarter*3); 

注意,在這些的quarter將要用於一個月的四分之一。如果你想要使用當前季度。如果你想下一個季度,然後做quarter+=1並檢查溢出(即如果季度是5,那麼它實際上是1)。另外,您可以添加%12在第一和最後一個月計算,然後它會正常工作與5

int firstMonthOfQuarterOfNextQuarter = (((quarter+1)*3)-2)%12; 
int lastMonthOfQuarterOfNextQuarter = ((quarter+1)*3)%12; 

四分之一我有點困惑,你想怎樣,因爲你要麼把它放到一起當前季度(在我的第一行中給出)或者在某些情況下還有下一個季度和當前季度的第一個和最後一個月。你如何回覆這個我不知道,所以你必須自己把它放在一起。

+0

我很好奇,這是如何考慮當天的需求? – Maritim

+0

@Maritim:日期對於你描述的算法並不重要。 '1/1/2013'輸出與'1/10/2013'相同的值。 – Guvante

+0

如果今天的日期大於給定日期,那麼當前每個季度的第一個月不再有趣。在這種情況下,目標是檢索下一個年度季度的第一個月。試圖在2013年8月1日的第一個月的方法返回7月,但預期的產值是10月,因爲在7月至8月的季度已經過去了。 – Maritim

0
var currentDate = DateTime.Now; 
var quarterNumber = ((currentDate.Month-1)/3) + 1; 
var firstDayOfQuarter = new DateTime(currentDate.Year, ((quarterNumber-1) * 3) + 1, 1); 
var lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1); 
0

寫包裝類,給人的第一或最後一個月基於當前日期時間,並給該月的名稱從的CurrentCulture設置

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(Quater.GetFirstMonth(DateTime.Now.Month)); // Outputs october 
     Console.WriteLine(Quater.GetLastMonth(DateTime.Now.Month)); // Outputs september 

     Console.ReadLine(); 
    } 
} 

public static class Quater 
{ 
    public static string GetFirstMonth(int month) 
    { 
     if (month >= 1 && month <= 3) { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(4); 
     } 
     if (month >= 4 && month <= 6) { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(7); 
     } 
     if (month >= 7 && month <= 9) { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(10); 
     } 
     if (month >= 10 && month <= 12) { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(1); 
     } 

     return string.Empty; 
    } 

    public static string GetLastMonth(int month) 
    { 
     if (month >= 1 && month <= 3) 
     { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(3); 
     } 
     if (month >= 4 && month <= 6) 
     { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(6); 
     } 
     if (month >= 7 && month <= 9) 
     { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(9); 
     } 
     if (month >= 10 && month <= 12) 
     { 
      return CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(12); 
     } 

     return string.Empty; 
    } 
} 
0

這些輔助方法應該給你你需要的一切:

public static class DateTimeHelpers 
{ 
    private static DateTime StartDateOfCurrentQuarter(DateTime instant) 
    { 
     return new DateTime(instant.Year , 1 + 3*((instant.Month-1)/3) , 1) ; 
    } 
    public static void CurrentQuarter(this DateTime instant , out DateTime start , out DateTime end) 
    { 
     start = StartDateOfCurrentQuarter(instant) ; 
     end = start.AddMonths(3).AddTicks(-1) ; 
     return ; 
    } 
    public static void NextQuarter(this DateTime instant , out DateTime start , out DateTime end) 
    { 
     start = StartDateOfCurrentQuarter(instant).AddMonths(3) ; 
     end = start.AddMonths(3).AddTicks(-1) ; 
     return ; 
    } 
    public static void PrevQuarter(this DateTime instant , out DateTime start , out DateTime end) 
    { 
     start = StartDateOfCurrentQuarter(instant).AddMonths(-3) ; 
     end = start.AddMonths(3).AddTicks(-1) ; 
     return ; 
    } 
} 
+0

您的'StartDateOfCurrentQuarter'方法需要在本月添加一個方法。否則,如果它的一月份中斷(並且所有其他月份它比正確的時間早一個月)。 – Chris

+1

@克里斯 - 謝謝你的收穫。我的不好:修正了錯字。 –

0

可以使用季度Time Period Library for .NET的:

// ---------------------------------------------------------------------- 
public void QuarterStartEndMonth() 
{ 
    DateTime now = DateTime.Now; 

    Quarter pastQuarter = GetQuarter(new DateTime(now.Year - 1, 10, 1)); 
    Console.WriteLine("Quarter last month {0:d}", pastQuarter.LastMonthStart); 
    Console.WriteLine("Next quarter start month {0:d}", 
    pastQuarter.GetNextQuarter().Start); 

    Quarter futureQuarter = GetQuarter(new DateTime(now.Year + 1, 10, 1)); 
    Console.WriteLine("Quarter last month {0:d}", futureQuarter.LastMonthStart); 
    Console.WriteLine("Next quarter start month {0:d}", 
    futureQuarter.GetNextQuarter().Start); 
} // QuarterStartEndMonth 

// ---------------------------------------------------------------------- 
private Quarter GetQuarter(DateTime moment) 
{ 
    DateTime now = DateTime.Now; 
    return new Quarter(now > moment ? now : moment); 
} // GetQuarter 
相關問題