【问题标题】:Get the first day of a month in swift快速获取一个月的第一天
【发布时间】:2016-05-07 20:02:51
【问题描述】:

我正在寻找一种方法来获取一个月的第一天(在 Swift 中)。 我想知道是星期一,星期二等...通过返回相应的数字。

我尝试了许多解决方案,例如获取 NSCalendar 组件 .weekDay 但没有一个工作。

Example :

print(getTheFirstDate("2016-2-18"))

// Should return : 0 (because the first day of February 2016 is Monday).

任何帮助将不胜感激。

【问题讨论】:

  • 这里有很多方法(Objective-C 和 Swift):stackoverflow.com/questions/10717574/….
  • 如果我的回答是正确的,请将其标记为正确,这样人们就知道它是可靠的信息。

标签: swift calendar


【解决方案1】:

首先您需要解析您的日期字符串,然后您可以使用 Calendar 方法 dateComponents 从该日期获取日历、年份和月份组件,并从这些组件创建一个新日期。然后您可以从中提取工作日日期组件:

Xcode 11.5 • Swift 5.2

extension Date {
    var weekday: Int { Calendar.current.component(.weekday, from: self) }
    var firstDayOfTheMonth: Date {
        Calendar.current.dateComponents([.calendar, .year,.month], from: self).date!
    }
}

extension String {
    static var dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()
    
    var date: Date? {
       String.dateFormatter.date(from: self)
    }
}

"2016-2-18".date?.firstDayOfTheMonth.weekday   // 2 = Monday (Sunday-Saturday 1-7)

【讨论】:

    【解决方案2】:
    extension Date {
       var startOfWeek: Date {
          let gregorian = Calendar(identifier: .gregorian)
          let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
          return gregorian.date(byAdding: .day, value: 1, to: sunday!)!
       }
    
       var endOfWeek: Date {
          let gregorian = Calendar(identifier: .gregorian)
          let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
          return gregorian.date(byAdding: .day, value: 7, to: sunday!)!
       }
    
       var startOfPreviousWeek: Date {
          let gregorian = Calendar(identifier: .gregorian)
          let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
          return gregorian.date(byAdding: .day, value: -6, to: sunday!)!
       }
    
       var endOfPreviousWeek: Date {
          let gregorian = Calendar(identifier: .gregorian)
          let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self))
          return gregorian.date(byAdding: .day, value: 0, to: sunday!)!
       }
    
       var startDateOfMonth: Date {
          return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
       }
    
       var endDateOfMonth: Date {
          return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startDateOfMonth)!
       }
    
       var getPreviousMonthDate: Date {
          return Calendar.current.date(byAdding: .month, value: -1, to: self)!
       }
    
       var startDateOfPreviousMonth: Date {
          return getPreviousMonthDate.startDateOfMonth
       }
    
       var endOfPreviousMonth: Date {
          return getPreviousMonthDate.endDateOfMonth
       }
    }
    

    【讨论】:

      【解决方案3】:

      那么得到对应的星期几可以用:

      var weekday = calendar!.component(NSCalendarUnit.Weekday, fromDate: yourNSDate)
      var weekdayName = self.getDayOfWeek(weekday)
      

      然后就可以调用我创建的这个函数,根据传入getDayOfWeek()的数字来获取星期几的对应名称

      func getDayOfWeek(weekday:Int) -> String {
              if(weekday == 1) {
                  return "Sunday"
              }
              else if(weekday == 2) {
                  return "Monday"
              }
              else if(weekday == 3) {
                  return "Tuesday"
              }
              else if(weekday == 4) {
                  return "Wednesday"
              }
              else if(weekday == 5) {
                  return "Thursday"
              }
              else if(weekday == 6) {
                  return "Friday"
              }
              else {
                  return "Saturday"
              }
      
          }
      

      如果您使用字符串作为开始日期,您可以将其更改为 NSDate,如下所示:

      let dateFormatter = NSDateFormatter()
      dateFormatter.dateFormat = /*place date format here*/
      let date = dateFormatter.dateFromString(/*your_date_string*/)
      

      【讨论】:

      • 为什么投反对票?我很确定这是一个解决方案。
      • 那不是我,但是当我尝试使用您的代码时:let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-M-d" let date = dateFormatter.dateFromString("2016-4-1") let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! var weekday = calendar.component(NSCalendarUnit.Weekday, fromDate: date!) weekday 等于 6,但答案是 4
      • 没错。 2016-4-1 是星期五。格式为年-月-日。
      • 天哪,你是对的!我是法国人,所以这周从星期一开始。所以对我来说,星期五是 5 点......我的错非常感谢你;)
      • 不要将getDayOfWeek 函数与硬编码的工作日名称一起使用。 [NS]DateFormatter 已经提供了一种从工作日编号获取工作日名称的方法。
      【解决方案4】:

      我喜欢 Leo 的回答,但如果您想将逻辑封装到单个函数中或不想使用扩展。

      func getDayOfWeekForFirstDayOfMonthFromDateString(dateString:String) -> String? {
      
          let formatter = NSDateFormatter()
          formatter.dateFormat = "yyyy-MM-dd"
      
          if let date = formatter.dateFromString(dateString) {
              if let firstOfMonth = NSCalendar.currentCalendar().dateFromComponents(NSCalendar.currentCalendar().components([.Year, .Month], fromDate: date)) {
                  formatter.dateFormat = "EEEE"
                  return formatter.stringFromDate(firstOfMonth)
              }
          }
          return nil
      }
      

      编辑:调整代码以利用 Leo 的伟大建议,并借用他更简洁的创建月份对象的创建。谢谢,狮子座!

      【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2013-02-14
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      相关资源
      最近更新 更多