今天,昨天,本周,上周,本月,上个月......变量获得NSDate

has*_*nat 84 iphone comparison time nsdate

我想做的是今天,昨天,本周,本周,本周,本月,上个月变量准备比较要在UITableView的titleForHeaderInSection上添加标题的NSDate

我想要的是在下面的代码中手动完成日期2009-12-11

 NSDate *today = [NSDate dateWithString:@"2009-12-11 00:00:00 +0000"];
 NSDate *yesterday = [NSDate dateWithString:@"2009-12-10 00:00:00 +0000"];
 NSDate *thisWeek = [NSDate dateWithString:@"2009-12-06 00:00:00 +0000"];
 NSDate *lastWeek = [NSDate dateWithString:@"2009-11-30 00:00:00 +0000"];
 NSDate *thisMonth = [NSDate dateWithString:@"2009-12-01 00:00:00 +0000"];
 NSDate *lastMonth = [NSDate dateWithString:@"2009-11-01 00:00:00 +0000"];
Run Code Online (Sandbox Code Playgroud)

Ben*_*n S 93

改编自日期和时间编程指南:

// Right now, you can remove the seconds into the day if you want
NSDate *today = [NSDate date];

// All intervals taken from Google
NSDate *yesterday = [today dateByAddingTimeInterval: -86400.0];
NSDate *thisWeek  = [today dateByAddingTimeInterval: -604800.0];
NSDate *lastWeek  = [today dateByAddingTimeInterval: -1209600.0];

// To get the correct number of seconds in each month use NSCalendar
NSDate *thisMonth = [today dateByAddingTimeInterval: -2629743.83];
NSDate *lastMonth = [today dateByAddingTimeInterval: -5259487.66];
Run Code Online (Sandbox Code Playgroud)

如果您想要正确的确切天数,具体取决于月份,则应使用NSCalendar.

  • 固定常数的时间是BAD BAD BAD.闰日或闰秒怎么样?使用NSDateComponents,或者当您的日期戳开始不匹配时,您将遇到一些非常讨厌和难以调试的问题. (77认同)
  • 如果你只是想要大约上周的帖子或其他什么,那真的不是那么糟糕.我指定如果需要准确性,OP应该使用`NSCalendar`. (11认同)
  • @Chris除非天不是86400秒.夏令时呢?这听起来微不足道,但这实际上可以引导你发现超级粗糙的错误,这些错误来自DST点击的时候,你不记得把它考虑在内. (3认同)
  • 固定常数实际上应该适用于计算天数:每天是86400秒.闰秒只需要两倍的时间 - 闰秒的一天仍然有86400'秒'.至于几个月......是的,明确:) (2认同)

has*_*nat 82

可能是一个更好的方式来写这个,但在这里我提出了Ben的NSCalendar建议并从那里工作到NSDateComponents

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:( NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ) fromDate:[[NSDate alloc] init]];

[components setHour:-[components hour]];
[components setMinute:-[components minute]];
[components setSecond:-[components second]];
NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0]; //This variable should now be pointing at a date object that is the start of today (midnight);

[components setHour:-24];
[components setMinute:0];
[components setSecond:0];
NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0];

components = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:[[NSDate alloc] init]];

[components setDay:([components day] - ([components weekday] - 1))]; 
NSDate *thisWeek  = [cal dateFromComponents:components];

[components setDay:([components day] - 7)];
NSDate *lastWeek  = [cal dateFromComponents:components];

[components setDay:([components day] - ([components day] -1))]; 
NSDate *thisMonth = [cal dateFromComponents:components];

[components setMonth:([components month] - 1)]; 
NSDate *lastMonth = [cal dateFromComponents:components];

NSLog(@"today=%@",today);
NSLog(@"yesterday=%@",yesterday);
NSLog(@"thisWeek=%@",thisWeek);
NSLog(@"lastWeek=%@",lastWeek);
NSLog(@"thisMonth=%@",thisMonth);
NSLog(@"lastMonth=%@",lastMonth);
Run Code Online (Sandbox Code Playgroud)

  • @Shaggy Frog:我猜他假设ARC已启用...;) (21认同)
  • 你用那些`fromDate:[[NSDate alloc] init]`位来泄漏内存. (13认同)
  • @orj FYI,ARC在该答案发布后出现了很长时间 (5认同)
  • 此代码无法正常运行.它没有考虑作为输入日期一部分的秒的分数.也就是说,日期可能有30.1234秒,而NSDateComponents只有30作为秒值,所以从NSDate减去30秒会让你在午夜过后0.1234秒.此外,有些日子比24小时(夏令时)更多(或更少),所以到昨天的日期应该真的使用[components setDay:-1]而不是[components setHour:-24]. (3认同)
  • @orj此外,在夏令时更改时,减去小时数不会给你午夜.-1.这段代码不值得35票. (3认同)

Chr*_*eer 40

NSDateComponents今天很高兴:

NSCalendar *cal = [NSCalendar currentCalendar];

NSDate *date = [NSDate date];
NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                                                          fromDate:date];
NSDate *today = [cal dateFromComponents:comps];
Run Code Online (Sandbox Code Playgroud)

这将创建一个仅包含年,月和日期的NSDate:

(gdb) po today
2010-06-22 00:00:00 +0200
Run Code Online (Sandbox Code Playgroud)

要获得昨天等,您可以使用NSDateComponents计算它:

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:-1];
NSDate *yesterday = [cal dateByAddingComponents:components toDate:today options:0];
Run Code Online (Sandbox Code Playgroud)


Dus*_*tin 19

+ (NSDate*)dateFor:(enum DateType)dateType {

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *comps =
    [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                fromDate:[NSDate date]];

    if(dateType == DateYesterday) {

        comps.day--;
    }
    else if(dateType == DateThisWeek) {

        comps.weekday = 1;
    }
    else if(dateType == DateLastWeek) {

        comps.weekday = 1;
        comps.week--;
    }
    else if(dateType == DateThisMonth) {

        comps.day = 1;
    }
    else if(dateType == DateLastMonth) {

        comps.day = 1;
        comps.month--;
    }
    else if(dateType != DateToday)
        return nil;

    return [calendar dateFromComponents:comps];
}
Run Code Online (Sandbox Code Playgroud)


gok*_*urt 10

Swift 4.2

let today = Date()
let yesterday = today.addingTimeInterval(-86400.0)
let thisWeek = today.addingTimeInterval(-604800.0)
let lastWeek = today.addingTimeInterval(-1209600.0)

let thisMonth = today.addingTimeInterval(-2629743.83)
let lastMonth = today.addingTimeInterval(-5259487.66)

// components of the date
let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
let components = calendar.dateComponents([.year, .month, .day], from: today)
let (year, month, day) = (components.year, components.month, components.day)
Run Code Online (Sandbox Code Playgroud)

请注意,日期组件是可选的.