【问题标题】:How to calculate amount of days in each quarter如何计算每个季度的天数
【发布时间】:2017-04-27 11:49:33
【问题描述】:

我想知道如何正确获取每个季度的天数。 考虑到闰年。

例如:

  • 1 个季度:90(或 91 闰年)
  • 2 季度:91 -当前季度
  • 第三季:92
  • 4 季度:92

从文档中可以理解,我们应该将第 12 年分为 4 个部分。然后得到每个季度的天数,如 3 *(3 个月的天数)。但它是如何以更复杂的方式完成的,无需硬编码。

【问题讨论】:

  • 为 1 月 1 日、4 月 1 日等创建 DateComponents,然后使用 Calendar 方法计算天数差异。

标签: swift time


【解决方案1】:

您可以使用 DateFormatter dateFormat "q" 并将其转换为整数。

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)

【讨论】:

  • 不错的答案。尤其是扩展格式化程序。
【解决方案2】:

您应该使用 NSCalendar 对象来计算每个季度的天数。

例如:第一季度:1 月 1 日至 4 月 1 日

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)")

【讨论】:

  • 我可以从 DateFormatter 获取当前季度吗?
  • DateFormatter 中没有季度信息(或者我不知道)。但是您可以使用 NSCalendar 从当前日期(对于 Calendar.Component.quarter)获取 DateComponents,然后您可以知道当前季度是哪个。
  • 我发现 DateFormatter 可以提供有关季度的信息,它是“Q” - 一年中的季度。如果您想要零填充,请使用 QQ。
  • 你是对的。因此,您可以在当前日期使用 DateFormatter 获取季度。也许这会对你有所帮助:waracle.net/iphone-nsdateformatter-date-formatting-table
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 2020-02-25
  • 1970-01-01
  • 2021-04-26
  • 2010-09-23
  • 1970-01-01
  • 2021-12-20
  • 2022-01-16
相关资源
最近更新 更多