关键词:
看了几个关于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 year和confirmed 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); }} //获取一年中第... 查看详情