在上午12:00动态创建上一个星期日的日期

时间:2012-07-19 16:16:30

标签: ios nsdate

我正在努力弄清楚如何在上午12:00的最前一个星期日动态创建日期对象

我以为我可以得到今天的日期,然后减去当周的当天+ 1,此时我可以减去当天的时间到达早上12点。

到目前为止,我有一周的当天:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
int weekday = [comps weekday];

此时我可以获得今天的日期并减去一天中weekday *秒的差异。但是,我怎样才能在几秒钟内得到今天的时间?

4 个答案:

答案 0 :(得分:7)

无需手动计算秒数(由于夏令时等因此无论如何都是危险的)。以下内容应该完全符合您的要求:

NSDate *today = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"]]; // force US locale, because other countries (e.g. the rest of the world) might use different weekday numbering

NSDateComponents *nowComponents = [calendar components:NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today];

[nowComponents setWeekday:1]; //Sunday
[nowComponents setHour:0]; // 12:00 AM = midnight (12:00 PM would be 12)
[nowComponents setMinute:0];
[nowComponents setSecond:0];

NSDate *previousSunday = [calendar dateFromComponents:nowComponents];

答案 1 :(得分:2)

我会担心夏令时与你之间的过渡:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *date = [NSDate date];
NSLog(@"date %@", date);

NSDateComponents *componentsToday = [gregorian components:NSWeekdayCalendarUnit fromDate:date]; // NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | 
NSInteger days = componentsToday.weekday - 1;
NSLog(@"Days=%d", days);

NSDate *lastSunday = [date dateByAddingTimeInterval:-days*60*60*24];
NSLog(@"lastSunday %@", lastSunday);

NSDateComponents *componentsSunday = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit  fromDate:lastSunday];
[componentsSunday setHour:0];
[componentsSunday setMinute:0];
[componentsSunday setSecond:0];
NSDate *targetDate = [gregorian dateFromComponents:componentsSunday];
NSLog(@"TargetDate %@", targetDate);

答案 2 :(得分:2)

Swift 2.0中的@AndreasLey解决方案:

  func getLastSunday() -> NSDate?
{
    let today = NSDate();
    let calendar : NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    calendar.locale = NSLocale(localeIdentifier: "en-US") // force US locale, because other countries (e.g. the rest of the world) might use different weekday numbering

    let flags : NSCalendarUnit = [.Year , .Month, .Weekday, .WeekOfMonth, .Minute , .Second]
    let nowComponents = calendar.components(flags, fromDate: today)

    nowComponents.weekday = 1 //Sunday
    nowComponents.hour = 0  // 12:00 AM = midnight (12:00 PM would be 12)
    nowComponents.minute = 0
    nowComponents.second = 0;


    let  previousSunday = calendar.dateFromComponents(nowComponents);
    return previousSunday
}

答案 3 :(得分:0)

此代码在UIDatePicker所选日期的上午12:00设置。

 NSDate *oldDateSelected = datePicker.date;
 unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components:unitFlags fromDate:oldDateSelected];
    comps.hour   = 00;
    comps.minute = 00;
    comps.second = 44;
    NSDate *newDate = [calendar dateFromComponents:comps];
    return newDate;