2010-07-15 57 views
2

假設我們是15/07/2010,我想獲得上週的第一天,即7月5日。我有以下方法,但它不起作用。似乎我的週日屬性有問題...NSDate/NSDateComponent問題

+ (NSDate *)getFirstDayOfPreviousWeek 
{ 
// Get current date 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *now = [NSDate date]; 

// Get today date at midnight 
NSDateComponents *components = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit) fromDate:now]; 
[components setHour:0]; 
[components setMinute:0]; 
[components setSecond:0]; 
NSInteger *dayNbr = [components weekday]; 
NSLog(@"week day:%@",dayNbr); // CRASH 
NSDate *todayMidnight = [cal dateFromComponents:components]; 

// Get first day of previous week midnight 
components = [[[NSDateComponents alloc] init] autorelease]; 
NSInteger *wd = [dayNbr intValue] * -1 + 1; 
[components setWeekDay:wd]; 
[components setWeek:-1]; 
NSDate *newDate = [cal dateByAddingComponents:components toDate:todayMidnight options:0]; 
[cal release]; 

NSLog(@"new date:%@", newDate); 

return newDate; 
} 

請問您可以幫忙嗎?

非常感謝,

呂克

+0

首先讓你的類型直線出來,NSLog(@「..%@ ...」,xxx);將採取NSString作爲參數,而你似乎把任何東西都放在裏面。 – mvds 2010-07-15 19:23:46

+0

其實,看起來你可以把任何東西放在裏面聽'description'消息,它通常可以是任何對象,但是'NSInteger'不是一個對象:因爲你不''將'NSInteger * dayNbr'改爲'NSInteger dayNbr' t想要一個指針,並將'%@'更改爲'%d',因爲它是一個整數。 – mvds 2010-07-15 19:34:45

+0

謝謝,我沒有得到NSInteger不是一個對象。 – Luc 2010-07-15 21:04:40

回答

8

我認爲它應該是一個容易得多

- (NSDate *)getFirstDayOfPreviousWeek 
{ 
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDate *now = [NSDate date]; 
    NSLog(@"Current date: %@", now); 

    // required components for today 
    NSDateComponents *components = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:now]; 

    // adjust them for first day of previous week (Monday) 
    [components setWeekday:2]; 
    [components setWeek:([components week] - 1)]; 

    // construct new date and return 
    NSDate *newDate = [cal dateFromComponents:components]; 
    NSLog(@"New date: %@", newDate); 

    return newDate; 
} 

注意此解決方案假定一週的第一天是星期一。

+0

太好了,非常感謝。 – Luc 2010-07-15 21:04:55

0

以下斯威夫特3遊樂場代碼展示瞭如何從任何日期獲得前一週的第一天:

import Foundation 

let calendar = Calendar(identifier: .gregorian) 
let intialDate = Date() 

// Prepare the new date components 
var newDateComponents = calendar.dateComponents([.year, .month, .weekOfMonth], from: intialDate) 
newDateComponents.weekOfMonth = newDateComponents.weekOfMonth! - 1 // get previous week 
newDateComponents.weekday = 2 // sunday is 1, monday is 2 

// Get the new date 
let newDate = calendar.date(from: newDateComponents) 
print(newDate ?? "Could not retrieve a date") 

如果您需要重複此操作,您可以重構你的代碼爲函數或方法:

import Foundation 

func firstDayOfPreviousWeek(from date: Date) -> Date? { 
    let calendar = Calendar(identifier: .gregorian) 
    var newDateComponents = calendar.dateComponents([.year, .month, .weekOfMonth], from: date) 
    newDateComponents.weekOfMonth = newDateComponents.weekOfMonth! - 1 
    newDateComponents.weekday = 2 
    return calendar.date(from: newDateComponents) 
} 

因此,下面的遊樂場代碼演示瞭如何獲取的第一天Ø f上週從2010年7月15日開始:

import Foundation 

func firstDayOfPreviousWeek(from date: Date) -> Date? { 
    let calendar = Calendar(identifier: .gregorian) 
    var newDateComponents = calendar.dateComponents([.year, .month, .weekOfMonth], from: date) 
    newDateComponents.weekOfMonth = newDateComponents.weekOfMonth! - 1 
    newDateComponents.weekday = 2 
    newDateComponents.timeZone = TimeZone(abbreviation: "GMT") 
    return calendar.date(from: newDateComponents) 
} 

let calendar = Calendar(identifier: .gregorian) 
var july15Components = DateComponents() 
july15Components.day = 15 
july15Components.month = 7 
july15Components.year = 2010 
july15Components.timeZone = TimeZone(abbreviation: "GMT") 
let july15 = calendar.date(from: july15Components)! 
print(july15) // prints 2010-07-15 00:00:00 +0000 

let newDate = firstDayOfPreviousWeek(from: july15) 
print(newDate ?? "Could not retrieve a date") // prints 2010-07-05 00:00:00 +0000