【问题标题】:Getting the dates of a week获取一周的日期
【发布时间】:2018-09-28 01:58:02
【问题描述】:

只有当我按下特定日期时,我才需要获取当月一周的所有日期。例如,如果我按 9 月 28 日,结果将是 9 月 23 日至 28 日的日期,但如果我按 9 月 30 日,结果将仅为 9 月 30 日,因为之后的日期是 10 月。

这是我获取一周日期的代码:

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 0, to: sunday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 6, to: sunday)
    }
}

但是对于这段代码,结果是 9 月 30 日 - 10 月 6 日,这不是我想要的。请帮忙

【问题讨论】:

  • 请记住,您的逻辑还需要处理不同语言环境中一周的不同开始日期。对于从星期一开始一周的语言环境,您希望 2018 年 9 月 30 日的日期为 9 月 24 日至 30 日。
  • 感谢您的提醒,但这将有一个固定的语言环境。

标签: ios swift nsdate


【解决方案1】:

您可以得到当月的最后一天,然后endOfWeek 将是您已有的和月末之间的最小值。

var endOfWeek: Date? {
    let gregorian = Calendar(identifier: .gregorian)
    guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
    let endOfWeek = gregorian.date(byAdding: .day, value: 6, to: sunday)
    let firstOfNextMonth = gregorian.date(byAdding: .month, value: 1, to: sunday)
    let lastOfThisMonth = gregorian.date(byAdding: .day: value: -1, to: firstOfNextMonth)

    return min(endOfWeek, lastOfThisMonth)
}

我不能保证该代码会编译,但它应该让您了解如何完成您想要的。

【讨论】:

    【解决方案2】:

    我想推荐 SwiftMoment,因为它是 Moment.js 的 Swift 端口。

    Moment.js 是一个内容丰富的库,其中包含大量文档和非常有用的功能。

    给定date,您可以获得start of week Dateend of week Date

    然后从那里,您可以枚举其间的日期。

    我目前在我的网络应用项目中使用 Moment.js 来获取给定日期的星期日期:

    getWeekDates (dateReference, format) {
        const startOfWeek = moment(dateReference).startOf('isoWeek');
        const endOfWeek = moment(dateReference).endOf('isoWeek');
    
        var days = [];
        var day = startOfWeek;
    
        while (day <= endOfWeek) {
            if (format !== undefined) {
              days.push(day.format(format));
            } else {
              days.push(day);
            }
            day = day.clone().add(1, 'd');
        }
    
        return days;
      }
    

    【讨论】:

      【解决方案3】:

      您可以将包含日期的星期和月份的间隔相交。

      这是一个快速测试:

      let calendar = Calendar(identifier: .gregorian)
      let date = DateComponents(calendar: calendar, year: 2018, month: 9, day: 30).date!
      
      let weekComponents = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: date)
      let startOfWeek = calendar.date(from: weekComponents)!
      let endOfWeek = calendar.date(byAdding: .weekOfYear, value: 1, to: startOfWeek)!
      let weekInterval = DateInterval(start: startOfWeek, end: endOfWeek)
      
      let monthComponents = calendar.dateComponents([.year, .month], from: date)
      let startOfMonth = calendar.date(from: monthComponents)!
      let endOfMonth = calendar.date(byAdding: .month, value: 1, to: startOfMonth)!
      let monthInterval = DateInterval(start: startOfMonth, end: endOfMonth)
      
      let targetRange = monthInterval.intersection(with: weekInterval)!
      let firstDay = targetRange.start
      let lastDay = calendar.date(byAdding: .day, value: -1, to: targetRange.end)
      

      您需要进行重构以避免强制解开所有日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 2015-03-10
        • 1970-01-01
        • 2021-12-31
        • 2019-03-31
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多