私は今年の日数を取得しようとしています。iPhone SDKを使用している特定の年の日数ですか?
Number of days in the current month using iPhone SDK?で解決策を試し、NSMearthCalendarUnitをNSYearCalendarUnitに置き換えると、その月の日数は引き続き取得されます。
私はこれをどのようにすべきか知っていますか?
ご協力いただきありがとうございます。
私は今年の日数を取得しようとしています。iPhone SDKを使用している特定の年の日数ですか?
Number of days in the current month using iPhone SDK?で解決策を試し、NSMearthCalendarUnitをNSYearCalendarUnitに置き換えると、その月の日数は引き続き取得されます。
私はこれをどのようにすべきか知っていますか?
ご協力いただきありがとうございます。
グレゴリオ暦を使用する場合は、手動で計算することができます。
http://en.wikipedia.org/wiki/Leap_year#Algorithm
if year modulo 400 is 0 then leap
else if year modulo 100 is 0 then no_leap
else if year modulo 4 is 0 then leap
else no_leap
私は最終的に機能するソリューションを思いつきました。私がしているのは、最初にその年の月数を計算してから、毎月、その月の日数を計算することです。
コードは次のようになります。
NSUInteger days = 0;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *today = [NSDate date];
NSDateComponents *components = [calendar components:NSYearCalendarUnit fromDate:today];
NSUInteger months = [calendar rangeOfUnit:NSMonthCalendarUnit
inUnit:NSYearCalendarUnit
forDate:today].length;
for (int i = 1; i <= months; i++) {
components.month = i;
NSDate *month = [calendar dateFromComponents:components];
days += [calendar rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:month].length;
}
return days;
私が望んでいるだろうが、それは、通常のグレゴリオ暦1またはイスラム一つとして、任意のカレンダーのために働くだろうとニートではありません。
このように、NSCalendar
とNSDateComponent
クラスを使用します。例として
long GetDaysInYear(int year) {
NSDateComponents* c = [[NSDateComponents alloc] init];
c.year = year;
NSCalendar* cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate* startDate = [cal dateFromComponents:c];
c.year += 1;
NSDate* endDate = [cal dateFromComponents:c];
return [cal components:NSDayCalendarUnit fromDate:startDate toDate:endDate options:0].day;
}
:これは(かもしれない)原因355を返し、354
func daysInYear(year: Int) -> Int {
var calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
var b = NSDate.dateWithNaturalLanguageString("01.01.\(year)", locale: NSLocale.currentLocale()) as! NSDate
var e = NSDate.dateWithNaturalLanguageString("12.31.\(year)", locale: NSLocale.currentLocale()) as! NSDate
return calendar!.components(NSCalendarUnit.CalendarUnitDay, fromDate: b, toDate: e, options: nil).day + 1
}
しかし、デフォルトの日そのカウントがゼロから始まります。 )
1日目から始めるので、1つ少ないです。 12月31日から12月31日までは、それは1年です。 –
年は01.01.2015 00:00:00(000)から開始し、31.12.2015 23:59:59(99)に終了したと思います。 :)) – iTux
スウィフト2の拡張子は、NSCalendar
です。
extension NSCalendar {
func daysInYear(date: NSDate = NSDate()) -> Int? {
let year = components([NSCalendarUnit.Year], fromDate: date).year
return daysInYear(year)
}
func daysInYear(year: Int) -> Int? {
guard let begin = lastDayOfYear(year - 1), end = lastDayOfYear(year) else { return nil }
return components([NSCalendarUnit.Day], fromDate: begin, toDate: end, options: []).day
}
func lastDayOfYear(year: Int) -> NSDate? {
let components = NSDateComponents()
components.year = year
guard let years = dateFromComponents(components) else { return nil }
components.month = rangeOfUnit(NSCalendarUnit.Month, inUnit: NSCalendarUnit.Year, forDate: years).length
guard let months = dateFromComponents(components) else { return nil }
components.day = rangeOfUnit(NSCalendarUnit.Day, inUnit: NSCalendarUnit.Month, forDate: months).length
return dateFromComponents(components)
}
}
あなたはこのようにそれを使用することができます:
let calendar = NSCalendar.currentCalendar() // I'm using the Gregorian calendar
calendar.daysInYear() // 365 (since it's currently 2015)
calendar.daysInYear(2016) // 366 (leap year!)
これは、カレンダーの長さについては何も想定していないので、超柔軟である:
let hebrew = NSCalendar(calendarIdentifier: NSCalendarIdentifierHebrew)
hebrew?.daysInYear(-7) // 354
hebrew?.daysInYear(-100) // 384
をお楽しみください。
もう1つの方法は、指定された年の月を取得して、毎月を列挙して日数を加算することです。私はどちらがより正確か、より効率的かはわかりません。私は私の現在のアプローチが最も効率的だと思います。しかし、他の方法でそれを行うのがより正確であるかどうかは分かりません。時間がかかりません。 –
年を計算するのは簡単ですが、一般的には、日付/時刻ライブラリを利用できるようにすることをおすすめします。日付/時刻の計算を手動で行うと、いつも戻ってきて何とかあなたを噛んでいます... – Krumelur
私はこれを強くお勧めします。時間は非常に複雑です。グレゴリオ暦を使用していない可能性がある他のロケールで作業する必要がある場合、または過去の作業(やはりグレゴリオ暦ではない)で作業する必要がある場合、これは機能しません。 NSCalendarはこれらの問題を解決するのに最適です。 –