美文网首页
NSDate 得到各种想要日期

NSDate 得到各种想要日期

作者: 简化 | 来源:发表于2019-11-07 15:55 被阅读0次

    这篇文件将会得到以下日期:
    1.当前时间
    2.今日凌晨
    3.这个星期 这个星期星期一的日期
    4.上个星期 星期一的日期
    (约定每周一 为 一周 的开始)

    代码如下:

    获取今日凌晨时间:

        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSDateComponents *components = [calendar components:NSUIntegerMax fromDate:[NSDate date]];
        components.hour = 0;
        components.minute = 0;
        components.second = 0;
    
        //获取趋势时间
        NSTimeInterval ts = (double)(int)[[calendar dateFromComponents:components] timeIntervalSince1970];
        NSDate * date = [NSDate dateWithTimeIntervalSince1970:ts];
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        NSLog(@"时区是%@",zone);
        NSInteger interval = [zone secondsFromGMTForDate: date];
        NSDate *localeZeroDate = [date dateByAddingTimeInterval: interval];
        NSLog(@"本地凌晨时间是%@",localeZeroDate);
        //下边的语句输出应该是 Thu Nov  7 14:35:08 2019 这样的格式
        NSDate* temoDate = [[NSDate alloc] init];
        NSLog(@"%@",temoDate);
    

    第一个语句[NSDate date] 得到的时间是2019-11-07 06:38:56 +0000 也就是 2019-11-07 06:38:56 UTC。 当我们设置 hour minute second0的时候得到的就是UTC 的凌晨时间。所以为了得到我们的凌晨时间,就需要加上时区的偏移量。利用secondsFromGMTForDate 方法获取时区的偏移量,再增加到GMT的凌晨时间上来,就是本地的凌晨时间显示了。

        NSTimeInterval ts = (double)(int)[[calendar dateFromComponents:components] timeIntervalSince1970];// 从格林威治时间 到 今天 的时间差
        NSDate * date = [NSDate dateWithTimeIntervalSince1970:ts];//date = 今天格林威治凌晨 = 格林威治时间 + 时间差 (这里虽然看起来重复,但是保存了格林威治时间这个时间点下来)
        NSTimeZone *zone = [NSTimeZone systemTimeZone];//
        NSLog(@"时区是%@",zone);
        NSInteger interval = [zone secondsFromGMTForDate: date];
        NSDate *localZeroDate = [date dateByAddingTimeInterval: interval];
    

    获取当前时间:

        NSTimeInterval ts = (double)(int)[[calendar dateFromComponents:components] timeIntervalSince1970];// 从格林威治时间 到 今天 的时间差
        NSDate * date = [NSDate dateWithTimeIntervalSince1970:ts];//date = 今天格林威治凌晨 = 格林威治时间 + 时间差 (这里虽然看起来重复,但是保存了格林威治时间这个时间点下来)
        NSTimeZone *zone = [NSTimeZone systemTimeZone];//
        NSLog(@"时区是%@",zone);
        NSInteger interval = [zone secondsFromGMTForDate: date];
        NSDate *localDate = [[NSDate date] dateByAddingTimeInterval: interval];//UTC 时间加上偏移量
    

    components 的属性:


    截屏2019-11-07下午2.46.56.png

    有了上边的凌晨 和 当前设置其他就简单了。

    剩余时间

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setLocale:[NSLocale currentLocale]];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
        [dateFormatter setTimeStyle:NSDateFormatterLongStyle];
        
        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:NSCalendarMatchStrictly]; //This variable should now be pointing at a date object that is the start of today (midnight);
        NSDate *today = [cal dateByAddingComponents:components toDate:[[NSDate alloc] init] options:0];
        self.today = today;
        [components setHour:-24];
        [components setMinute:0];
        [components setSecond:0];
        NSDate *yesterday = [cal dateByAddingComponents:components toDate: today options:0];
        self.yesterday = yesterday;
        components = [cal components:NSCalendarUnitWeekday | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[[NSDate alloc] init]];
        self.weekDays = [components weekday];//这里是记录这周过了几天,排除今天
        //NSLog(@"%@",components);
        [components setDay:([components day] - ([components weekday] - 2))];// 星期一为数字 2, 所以今天是周一 那么加上自己的weekday + offset -> offset = -2
        //NSLog(@"%@",components);
    
        NSDate *thisWeek = [cal dateFromComponents:components];
        self.thisWeek = thisWeek;
        [components setDay:([components day] - 7)];
        NSDate *lastWeek = [cal dateFromComponents:components];
        self.lastWeek = lastWeek;
        
        [components setDay:([components day] - ([components day] -1))];
        NSDate *thisMonth = [cal dateFromComponents:components];
        self.thisMonth = thisMonth;
        [components setMonth:([components month] - 1)];
        NSDate *lastMonth = [cal dateFromComponents:components];
        self.lastMonth = lastMonth;
        NSString * dateDisplay = [dateFormatter stringFromDate:today];
        NSLog(@"today = %@",dateDisplay);
        dateDisplay = [dateFormatter stringFromDate:yesterday];
        NSLog(@"yesterday = %@",dateDisplay);
        dateDisplay = [dateFormatter stringFromDate:thisWeek];
        NSLog(@"thisWeek = %@",dateDisplay);
        dateDisplay = [dateFormatter stringFromDate:lastWeek];
        NSLog(@"lastWeek = %@",dateDisplay);
        dateDisplay = [dateFormatter stringFromDate:thisMonth];
        NSLog(@"thisMonth = %@",dateDisplay);
        dateDisplay = [dateFormatter stringFromDate:lastMonth];
    
    

    这里注意下 NSDate的输出格式可能有 2019/11/7, 12:00:00 AM GMT+8 或者 2019/11/7, 00:00:00 GMT+8 这两个是等价的,但是不同的iOS版本,现实的结果不一样。应该不会有什么影响。 里边的weekday该参数是 234561 也就是 1234567(星期)

    这个地方会争议 [components setDay:([components day] - ([components weekday] - 2))]; 因为我用来统计今天之前的一周之内的数据,所以234567可以这样写。2 - 2 = 0刚好是今日,也就是这周的开始。所以这周,该怎么使用需要看实际的需求时怎样的了。

    相关文章

      网友评论

          本文标题:NSDate 得到各种想要日期

          本文链接:https://www.haomeiwen.com/subject/pmcvbctx.html