计算给定月份的周数-斯威夫特(代码片段)

author author     2023-05-13     459

关键词:

看了几个关于SO的不同建议,我无法确定为什么下面的函数不起作用。它似乎在几个月内返回6,在其他月份返回5。当几周改变几天时,它完美地运作。

例如,尝试

weeksInMonth(8, forYear 2015) 

结果6。

我相信我对日历上的“第一周日”财产有误解,但没有得到Apple或网上的充分解释。

试过了.WeekOfMonth和.WeekOfYear。再也无法找到确切差异的解释。

任何建议都会受到欢迎。

func weeksInMonth(month: Int, forYear year: Int) -> Int?

    if (month < 1 || month > 12)  return nil 

    let dateString = String(format: "%4d/%d/01", year, month)
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy/MM/dd"
    if let date = dateFormatter.dateFromString(dateString),
       let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    
        calendar.firstWeekday = 2 // Monday
        let weekRange = calendar.rangeOfUnit(.WeekOfMonth, inUnit: .Month, forDate: date)
        let weeksCount = weekRange.length
        return weeksCount
    
    else
    
        return nil
    

更新:

道歉我的问题不明确。我想弄清楚一个月里有多少个星期,其中包括星期一。对于八月,这应该是5。

答案

您的代码计算一个月内(完整或部分)发生的周数。你显然想要的是给定月份的星期一数量。使用NSDateComponents,尤其是weekdayOrdinal属性,你可以计算一个月内的第一个(weekdayOrdinal=1)和最后一个(weekdayOrdinal=-1)。然后计算周数差异(并添加一个)。

Swift 2中可能的实现:

func numberOfMondaysInMonth(month: Int, forYear year: Int) -> Int?

    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    let comps = NSDateComponents()
    comps.month = month
    comps.year = year
    comps.weekday = calendar.firstWeekday
    comps.weekdayOrdinal = 1
    guard let first = calendar.dateFromComponents(comps)  else 
        return nil
    

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.dateFromComponents(comps)  else 
        return nil
    

    // Difference in weeks:
    let weeks = calendar.components(.WeekOfMonth, fromDate: first, toDate: last, options: [])
    return weeks.weekOfMonth + 1

注意:从文档开始,从月底开始向后计数的负weekdayOrdinal不明显。它在Determine NSDate for Memorial Day in a given yearconfirmed by Dave DeLong观察到。


Swift 3更新:

func numberOfMondaysInMonth(_ month: Int, forYear year: Int) -> Int? 
    var calendar = Calendar(identifier: .gregorian)
    calendar.firstWeekday = 2 // 2 == Monday

    // First monday in month:
    var comps = DateComponents(year: year, month: month,
                               weekday: calendar.firstWeekday, weekdayOrdinal: 1)
    guard let first = calendar.date(from: comps)  else 
        return nil
    

    // Last monday in month:
    comps.weekdayOrdinal = -1
    guard let last = calendar.date(from: comps)  else 
        return nil
    

    // Difference in weeks:
    let weeks = calendar.dateComponents([.weekOfMonth], from: first, to: last)
    return weeks.weekOfMonth! + 1

另一答案

实际上你的问题是:一个月内有多少个星期一?

我的方法是计算当月的第一个星期一,这可以通过将CalendarUnit WeekdayOrdinal设置为1来完成。然后获取总天数并进行一些数学计算。

Swift 1.2

func mondaysInMonth(month: Int, forYear year: Int) -> Int?

  if 1...12 ~= month 

    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    let components = NSDateComponents()
    components.weekday = 2 // Monday
    components.weekdayOrdinal = 1
    components.month = month
    components.year = year

    if let date = calendar.dateFromComponents(components)  
      let firstDay = calendar.component(.CalendarUnitDay, fromDate: date)
      let days = calendar.rangeOfUnit(.CalendarUnitDay, inUnit:.CalendarUnitMonth, forDate:date).length
      return (days - firstDay) / 7 + 1
    
  
  return nil

斯威夫特2

func mondaysInMonth(month: Int, forYear year: Int) -> Int?

  guard 1...12 ~= month else  return nil 

  let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
  let components = NSDateComponents()
  components.weekday = 2 // Monday
  components.weekdayOrdinal = 1
  components.month = month
  components.year = year

  if let date = calendar.dateFromComponents(components)  
    let firstDay = calendar.component(.Day, fromDate: date)
    let days = calendar.rangeOfUnit(.Day, inUnit:.Month, forDate:date).length
    return (days - firstDay) / 7 + 1
  
  return nil

另一答案

斯威夫特2

以下代码计算一个月中的周数。它不取决于月份开始或结束的那一天。

func weeksInMonth(month: Int, year: Int) -> (Int)? 

  let calendar = NSCalendar.currentCalendar()

  let comps = NSDateComponents()
  comps.month = month+1
  comps.year = year
  comps.day = 0

  guard let last = calendar.dateFromComponents(comps) else 
    return nil
  
  // Note: Could get other options as well
  let tag = calendar.components([.WeekOfMonth,.WeekOfYear,
       .YearForWeekOfYear,.Weekday,.Quarter],fromDate: last)

  return tag.weekOfMonth



// Example Usage:

if let numWeeks = weeksInMonth(8,year: 2015) 
  print(numWeeks) // Prints 6


if let numWeeks = weeksInMonth(12,year: 2015) 
  print(numWeeks) // Prints 5

另一答案

Swift 4+:

//-- Get number of weeks from calendar
func numberOfWeeksInMonth(_ date: Date) -> Int 
     var calendar = Calendar(identifier: .gregorian)
     calendar.firstWeekday = 1
     let weekRange = calendar.range(of: .weekOfMonth,
                                    in: .month,
                                    for: date)
     return weekRange!.count


//-- Implementation
let weekCount = numberOfWeeksInMonth(Date)
另一答案

Swift 4+:

从组件生成日期:

let dateComponents = DateComponents.init(year: 2019, month: 5)
let monthCurrentDayFirst = Calendar.current.date(from: dateComponents)!
let monthNextDayFirst = Calendar.current.date(byAdding: .month, value: 1, to: monthCurrentDayFirst)!
let monthCurrentDayLast = Calendar.current.date(byAdding: .day, value: -1, to: monthNextDayFirst)!

从日期检测周数:

let numberOfWeeks = Calendar.current.component(.weekOfMonth, from: monthCurrentDayLast)

如何计算编号。从当前周到给定周的周数?

】如何计算编号。从当前周到给定周的周数?【英文标题】:Howtocalculatetheno.ofWeeksfrompresentweektogivenweek?【发布时间】:2021-12-0823:33:48【问题描述】:我有一个格式为“YYYY-WW”的列,其中包含未来一周。如何计算编号。在Python中... 查看详情

php-计算两个日期之间的周数(代码片段)

我正在尝试计算两个日期之间的周数。以下代码的结果为3周。然而,它真的是4周。为什么计算不正确,解决方案是什么?我很想知道为什么这个特定的代码不起作用,但也想知道是否有更好的方法。我正在运行PHP7.2版。以下是... 查看详情

java关于周跨年的周数计算(代码片段)

从图中可以看出2016年的1月1日是从周五开始的,意思就是说2016年1月1日所在的这一周既是2015年的最后一周也是2016年的第一周,也就说这一周跨年了。编程是要求严谨的,这么算最后肯定会出问题,这就需要一个... 查看详情

找出一个月中给定日期的周数

Thissimplefunctionallowsyoutofindaweekspositioninthemonthbasedonagivendate.ForinstanceIneededtoalerttheusertheirdatewasthe"SecondWeekOfJanuary"duringagivenmonth.Imayneveruseitagainbutitcamei 查看详情

亚马逊 - Redshift:给定日期的周数错误

】亚马逊-Redshift:给定日期的周数错误【英文标题】:Amazon-Redshift:Weeknumberforagivendateiscomingwrong【发布时间】:2018-01-0809:30:52【问题描述】:考虑到星期日是一周的第一天,以下redshift中的语句应返回2作为周数,而不是返回1。Mysq... 查看详情

javascript获取日期范围从一年中的周数(代码片段)

查看详情

java关于周跨年的周数计算(代码片段)

从图中可以看出2016年的1月1日是从周五开始的,意思就是说2016年1月1日所在的这一周既是2015年的最后一周也是2016年的第一周,也就说这一周跨年了。编程是要求严谨的,这么算最后肯定会出问题,这就需要一个... 查看详情

季度计算 SQL 的周数

】季度计算SQL的周数【英文标题】:WeekofquartercalculationSQL【发布时间】:2016-11-2312:55:03【问题描述】:我正在尝试使用sql从cal_date_d表中查找季度的星期几。我的表有cal_date、财政季度开始和结束日期。我还有一个包含财政周数的... 查看详情

在计算两者之间的周数时避免夏令时

】在计算两者之间的周数时避免夏令时【英文标题】:AvoidDaylightSavingTimeincalculatingweeksinbetween【发布时间】:2018-08-2500:32:03【问题描述】:我正在尝试计算两个日期之间的周数。使用JavaSE8publiclongweekInBetween(Datedate1,Datedate2)returnChro... 查看详情

在 SQL 中获取日期的周数

...数据库的SQL来获取日期的周数?例如获取我使用的日期的月份:SELECTEXTRACT(MONTHFROM:DATE)但EXTRACT函数不知道SQL92中的周数。请注意我想要一个数据库独立的解决方案!不要将此误解为有关MSSQLServer的问题。【问题讨论 查看详情

如何在 Power Query M 中按给定日期查找 4 周滚动周期的周数

】如何在PowerQueryM中按给定日期查找4周滚动周期的周数【英文标题】:Howtofindweeknumberof4weekrollingcyclebygivendateinPowerQueryM【发布时间】:2021-10-2915:03:52【问题描述】:我有一个使用PowerQuery构建的日历表,我需要使用它来添加一个以... 查看详情

在红移中计算一年中的周数作为excel中的weeknum()

】在红移中计算一年中的周数作为excel中的weeknum()【英文标题】:calculateinredshifttheweeknumberoftheyearasweeknum()inexcel【发布时间】:2020-02-0713:50:01【问题描述】:我需要在redhsiftsql中计算一年中的周数,从星期日到星期六,从一月... 查看详情

编写一个java类,用于计算两个日期之间的周数。

importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Scanner;publicclassdemo3{ /** *@paramargs */ publicstaticvoidmain(String[]args){  //TODOAuto-generat 查看详情

如何从给定日期获取月份的星期几

】如何从给定日期获取月份的星期几【英文标题】:Howtogetweekofmonthfromgivendate【发布时间】:2022-01-2105:00:25【问题描述】:如何从给定日期获取weekOfMonth值。今天“2021-19-12”12月19日来到第4周但是传递任何日期值,如何获取特定... 查看详情

java中常用日期操作及方法

前言涉及到日期计算和字符串与日期转换,转来转去很是麻烦,于是归纳总结一下。以下都可以用。一、Dateformat类的常用格式y年Year1996;96 M年中的月份MonthJuly;Jul;07 w年中的周数Number27 W月份中的周数Number2 D年中的天数Number189 d月份... 查看详情

java日期时间

...时间元素表示示例GEra标志符TextADy年Year1996; 96M年中的月份MonthJuly; Jul; 07w年中的周数Number27    W月份中的周数Number2D年中的天数Number189d月份中的天数Number10F月份中的星期Number2E星期中的天数TextTu 查看详情

java中的dateformatter

...时间元素表示示例GEra标志符TextADy年Year1996; 96M年中的月份MonthJuly; Jul;07w年中的周数Number27W月份中的周数Number2D年中的天数Number189d月份中的天数Number10F月份中的星期Number2E星期中的天数TextTuesday; TueaAm/pm标记TextPMH一天中... 查看详情

js将日期转换成当年的周数(workweek)

最近使用js做表格,遇到要将根据日期得出workweek的需求,网上查了一些相关代码,这里修改下并做下记录{display:‘Work_Week‘,name:‘create_time‘,width:80,render:function(item){  returngetYearWeek(item.create_time);  }}  //获取一年中第... 查看详情