2017-04-27 14 views
0

毎年の四半期の日数を適切に取得する方法を知りたいと思います。 アカウントのうるう年を取ります。各四半期の日数の計算方法

  • 1四半期:90(又は91リープ年)
  • 2四半期:91現職四半期
  • 3四半期:92
  • 4四半期:92
例えば

文書から、12年を4つの部分に分ける必要があることが理解できます。次に、3 *(3か月の日数)のように各四半期の日の量を取得します。しかし、それはどのようにハードコードのより洗練された方法で行うことができます。

+1

は、1月1日のために 'DateComponents'、4月1日などを作成し、その後、日中の違いを計算するために' Calendar'メソッドを使用します。 –

答えて

1

各四半期の日数を計算するには、NSCalendarオブジェクトを使用する必要があります。例えば

:最初の四半期:1月1日4月1日あなたがたDateFormatter DATEFORMAT "q"を使用して整数に変換することができ

let df = DateFormatter() 
df.dateFormat = "yyyy-MM-dd" 

let firstDate = df.date(from: "2017-01-01")! 
let secondDate = df.date(from: "2017-04-01")! 

let calendar = Calendar(identifier: .gregorian) 
let dateComponents = calendar.dateComponents([Calendar.Component.day], from: firstDate, to: secondDate) 

print("number of day of Q1: \(dateComponents.day)") 
+0

DateFormatterから現在の四半期を取得できますか? –

+0

DateFormatterに四半期情報はありません(またはわかりません)。しかし、NSCalendarを使って現在のDate(Calendar.Component.quarter)からDateComponentsを取得すると、現在の四半期を知ることができます。 –

+0

私は、DateFormatterが "Q"である四半期に関する情報を提供できることを知っています - 年の四半期。 0パディングを使用する場合は、QQを使用してください。 –

2

へ。

extension Formatter { 
    static let quarter: DateFormatter = { 
     let formatter = DateFormatter() 
     formatter.calendar = Calendar(identifier: .iso8601) 
     formatter.locale = Locale(identifier: "en_US_POSIX") 
     formatter.dateFormat = "q" 
     return formatter 
    }() 
} 

extension Calendar { 
    static let iso8601 = Calendar(identifier: .iso8601) 
} 

extension Date { 
    var year: Int { return Calendar.iso8601.dateComponents([.year], from: self).year ?? 0 } 
    var quarter: Int { return Int(Formatter.quarter.string(from: self))! } 

    var firstDayOfYear: Date { return DateComponents(calendar: .iso8601, year: year, month: 1, day: 1).date!} 
    var firstDayOfNextYear: Date { return DateComponents(calendar: .iso8601, year: year.advanced(by: 1), month: 1, day: 1).date! } 

    var quarters: (q1: Int, q2: Int, q3: Int, q4: Int) { 
     var date = firstDayOfYear 
     var q1 = 0, q2 = 0, q3 = 0, q4 = 0 
     while date < firstDayOfNextYear { 
      switch date.quarter { 
      case 1: q1 += 1 
      case 2: q2 += 1 
      case 3: q3 += 1 
      case 4: q4 += 1 
      default: 
       break 
      } 
      date = Calendar.iso8601.date(byAdding: DateComponents(day: 1), to: date)! 
     } 
     return (q1: q1, q2: q2, q3: q3, q4: q4) 
    } 
} 

遊び場テスト:

Date().quarter     // 2 
Date().firstDayOfYear.quarter // 1 

Date().quarters // q1 90, q2 91, q3 92, q4 92) 
+1

いい答え。特にFormatterを拡張しました。 –

+0

ありがとうございます –

関連する問題