iOS-掌握了时间就掌握了一切!

Demo下载地址

一. NSDate相关知识

1.获取当前时间

[NSDate date];

注意: 获取的当前时间是世界时间:比我们用的时间慢8个小时.

2.世界时间转化为本地时间

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    // 世界时间转化为本地时间
    NSDate * localDate = [self worldDateToLocalDate:[NSDate date]];
    NSLog(@"本地时间: date = %@",localDate);
}

#pragma mark 世界时间转换为本地时间
- (NSDate *)worldDateToLocalDate:(NSDate *)date {
    // 获取本地时区
    NSTimeZone * localTimeZone = [NSTimeZone localTimeZone];
    //计算本地时间与时间时间的偏差
    NSInteger offset = [localTimeZone secondsFromGMTForDate:date];
    // 世界时间 + 偏差值 = 中国时区的时间
    NSDate * localDate = [date dateByAddingTimeInterval:offset];
    return localDate;
}

二. NSDateFormatter相关知识

1.基本知识

(1) 设置时间格式

/** 1. 设置时间格式
         说明下格式对应的意义
         YYYY(年)/MM(月)/dd(日) hh(时):mm(分):ss(秒) SS(毫秒)
         需要用哪个的话就把哪个格式加上去。
         值得注意的是,如果想显示两位数的年份的话,可以用”YY/MM/dd hh:mm:ss SS”,两个Y代表两位数的年份。
         而且大写的M和小写的m代表的意思也不一样。“M”代表月份,“m”代码分钟
         “HH”代表24小时制,“hh”代表12小时制

         ** 更详细的介绍 **
         a      : AM/PM (上午/下午)
         A      : 0~86399999 (一天的第A微秒)
         c/cc   : 1~7 (一周的第一天, 周天为1)
         ccc    : Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)
         cccc   : Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)
         d      : 1~31 (月份的第几天, 带0)
         D      : 1~366 (年份的第几天,带0)
         e      : 1~7 (一周的第几天, 带0)
         E~EEE  : Sun/Mon/Tue/Wed/Thu/Fri/Sat (星期几简写)
         EEEE   : Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday (星期几全拼)
         F      : 1~5 (每月的第几周, 一周的第一天为周一)
         h      : 1~12 (0 padded Hour (12hr)) 带0的时, 12小时制
         H      : 0~23 (0 padded Hour (24hr))  带0的时, 24小时制
         k      : 1~24 (0 padded Hour (24hr) 带0的时, 24小时制
         K      : 0~11 (0 padded Hour (12hr)) 带0的时, 12小时制
         L/LL   : 1~12 (0 padded Month)  第几月
         LLL    : Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec 月份简写
         LLLL   : January/February/March/April/May/June/July/August/September/October/November/December 月份全称
         m      : 0~59 (0 padded Minute) 分钟
         M/MM   : 1~12 (0 padded Month) 第几月
         MMM    : Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
         MMMM   : January/February/March/April/May/June/July/August/September/October/November/December
         q/qq   : 1~4 (0 padded Quarter) 第几季度
         qqq    : Q1/Q2/Q3/Q4 季度简写
         qqqq   : 1st quarter/2nd quarter/3rd quarter/4th quarter 季度全拼
         Q/QQ   : 1~4 (0 padded Quarter) 同小写
         QQQ    : Q1/Q2/Q3/Q4 同小写
         QQQQ   : 1st quarter/2nd quarter/3rd quarter/4th quarter 同小写
         s      : 0~59 (0 padded Second) 秒数
         S      : (rounded Sub-Second) 未知
         v~vvv  : (General GMT Timezone Abbreviation) 常规GMT时区的编写
         vvvv   : (General GMT Timezone Name) 常规GMT时区的名称
         w      : 1~53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year) 一年的第几周, 一周的开始为周日,第一周从去年的最后一个周日起算
         W      : 1~5 (0 padded Week of Month, 1st day of week = Sunday) 一个月的第几周
         y/yyyy : (Full Year) 完整的年份
         yy/yyy : (2 Digits Year)  2个数字的年份
         */
        [self.dateFormatter_one setDateFormat:@"yyyy-MM-dd HH:mm-ss"];

(2) 自定义区域语言

        /** 2. 自定义区域语言
         1. en_US   美国英语 (默认语言)
         2. zh_CN   简体中文
         */
        self.dateFormatter_one.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

(3) 设置日期和时间格式

        /** 3. NSDateFormatterStyle    // date and time format styles 日期和时间的格式

         // 默认美国英语下的输出
         NSDateFormatterNoStyle = kCFDateFormatterNoStyle,                    // 无输出
         NSDateFormatterShortStyle = kCFDateFormatterShortStyle,              // 10/29/12, 2:27 PM
         NSDateFormatterMediumStyle = kCFDateFormatterMediumStyle,            // Oct 29, 2012, 2:36:59 PM
         NSDateFormatterLongStyle = kCFDateFormatterLongStyle,                // October 29, 2012, 2:38:46 PM GMT+08:00
         NSDateFormatterFullStyle = kCFDateFormatterFullStyle                 // Monday, October 29, 2016, 2:39:56 PM China Standard Time
         };

         // 修改为简体中文下的输出
         typedef CF_ENUM(CFIndex, CFDateFormatterStyle) {    // date and time format styles
         kCFDateFormatterNoStyle = 0,       // 无输出
         kCFDateFormatterShortStyle = 1,    // 12-10-29 下午2:52
         kCFDateFormatterMediumStyle = 2,   // 2012-10-29 下午2:51:43
         kCFDateFormatterLongStyle = 3,     // 2012年10月29日 GMT+0800下午2时51分08秒
         kCFDateFormatterFullStyle = 4      // 2012年10月29日星期一 中国标准时间下午2时46分49秒
         };
         */
        self.dateFormatter_one.dateStyle = kCFDateFormatterFullStyle;
        self.dateFormatter_one.timeStyle = kCFDateFormatterFullStyle;

2.NSTimeZone

对时区的解释

/*
NSTimeZone: 时区是一个地理名字,是为了客服各个地区或者国家之间在时间上的混乱.\n1.GMT:0:00格林威治标准时间;UTC +00:00校准的全球时间;CCD +08:00中国的标准时间;\n2.任何时区都以GMT为基准,即任何NSTimeZone对象所代表的时区都是相对于GMT的,这里的相对性是NSTimeZone中的一个重要的属性,我们称之为当前时区相对于GMT的偏移量,一旦知道了一个偏移量,便可以确定一个时区。在iOS中,偏移量是以‘秒‘为单位的。\n3.iOS中的时间类NSDate中存储的时间,都是相对于GMT的,我们使用NSDate的时候,会根据App的时区设置返回与时区对应的数据。\n4.iOS中的时区表示方法:GMT+0800 GMT-0800;(+:东区  -:西区; 前两位是小时数,后两位是分钟数)。GMT+0830意思是比GMT早8小时外加30分钟的时区。
*/

    //只能够修改程序的defaultTimeZone,不能修改系统的,更不能修改其他程序的。
    NSTimeZone * timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT+0800"];
    [NSTimeZone setDefaultTimeZone:timeZone];

    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

    NSDate *dateNow = [NSDate date];
    NSLog(@"dateNow:%@",dateNow);
    NSLog(@"%@",[dateFormatter stringFromDate:dateNow]);

3.NSDate <--> NSString

- (void)NSStringToNSDate {

    NSString * timeStr = @"2016-01-01 01:01:01";
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSDate * date = [dateFormatter dateFromString:timeStr];
    NSLog(@"NSStringToNSDate: date = %@",date);
}

- (void)NSDateToNSString {

    NSDate * nowDate = [NSDate date];

    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    dateFormatter.dateStyle = kCFDateFormatterFullStyle;
    dateFormatter.timeStyle = kCFDateFormatterLongStyle;
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];

    NSString * dateStr = [dateFormatter stringFromDate:nowDate];
    NSLog(@"NSDateToNSString: dateStr = %@",dateStr);
}

4.NSTimeInterval

NSTimeInterval: 时间戳,从1970年1月1号 00:00:00开始走过的毫秒数.

- (void)initUI {
    /** NSTimeInterval
     1. 时间段 Interval --> 间隔
     2. 单位 秒s.
     */
    NSDate * startDate = [NSDate date];
    NSTimeInterval timeInterval = 60 * 60 + 0.5;
    NSDate * endDate = [startDate dateByAddingTimeInterval:timeInterval];

    //1. 计算两个时间点的间隔
    NSTimeInterval endTimeInerval = [self calculateBetweenStartDate:startDate AndEndDate:endDate];
    NSLog(@"时间间隔: endTimeInerval = %f",endTimeInerval);

    //2. NSTimeInterval -- > NSInteger
    NSInteger time1 = endTimeInerval;
    NSLog(@"NSTimeInterval -- > NSInteger: time1 = %ld",(long)time1);

    NSInteger time2 = round(endTimeInerval);
    NSLog(@"NSTimeInterval -- > NSInteger(四舍五入): time2 = %ld",(long)time2);
}

// 计算两个时间点之间的毫秒数
- (NSTimeInterval)calculateBetweenStartDate:(NSDate *)startDate AndEndDate:(NSDate *)endDate {

    NSTimeInterval startTime = [startDate timeIntervalSince1970]*1;
    NSTimeInterval endTime = [endDate timeIntervalSince1970]*1;
    NSTimeInterval value = endTime - startTime;
    NSLog(@"value: %f",value);
    return value;
}

5.比较两个时间的大小.

- (void)initUI {
    // 时间字符串
    NSString *createdAtString = @"2015-11-20 11:10:05";
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *createdAtDate = [fmt dateFromString:createdAtString];

    // 手机当前时间
    NSDate *nowDate = [NSDate date];
    /**
     NSComparisonResult的取值
     NSOrderedAscending = -1L, // 升序, 越往右边越大
     NSOrderedSame,  // 相等
     NSOrderedDescending // 降序, 越往右边越小
     */
    // 获得比较结果(谁大谁小)
    NSComparisonResult result = [nowDate compare:createdAtDate];
    if (result == NSOrderedAscending) { // 升序, 越往右边越大
        NSLog(@"createdAtDate > nowDate");
    } else if (result == NSOrderedDescending) { // 降序, 越往右边越小
        NSLog(@"createdAtDate < nowDate");
    } else {
        NSLog(@"createdAtDate == nowDate");
    }
}

6.计算一个时间段有多少天/小时/分钟/秒

- (void)initUI {
    NSTimeInterval value = 3659;
    NSArray * timeArray = [self calculateTimeQuantumWithValue:value];
    NSLog(@"时间: timeArray = %@",timeArray);
}

// 计算一个时间段是多少天 多少时分秒
- (NSArray *)calculateTimeQuantumWithValue:(NSTimeInterval)time {
    long value = (long)time;
    // 计算一天/一小时/一分钟/一秒 包含多少秒
    long day = 60 * 60 * 24;
    long hour = 60 * 60;
    long minute = 60;
    long second = 1;

    long daysCount = value / day;
    long hoursCount = (value % day) / hour;
    long minutesCount = ((value % day) % hour) / minute;
    long secondsCount = (((value % day) % hour) % minute) / second;

    NSString * daysStr = [NSString stringWithFormat:@"day: %ld",daysCount];
    NSString * hoursStr = [NSString stringWithFormat:@"hour: %ld",hoursCount];
    NSString * minutesStr = [NSString stringWithFormat:@"minute: %ld",minutesCount];
    NSString * secondsStr = [NSString stringWithFormat:@"second: %ld",secondsCount];

    NSArray * timeArray = @[daysStr,hoursStr,minutesStr,secondsStr];

    return timeArray;
}

三.NSCalender相关 (待补充)

1.实例化 (三种方法)

- (void)way_one {
    // 若获取dateComponents对象时,设置components的时候未添加NSYearCalendarUnit,dateComponents.year将返回错误的数值,其他的也一样,所以使用NSDateComponents表示时间时,要确保需要使用的数据都在componets中添加了。

    // 先定义一个遵循某个历法的日历对象
    NSCalendar * greCalender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    // 通过已定义的日历对象,后去某个时间点的NSDateComponents表示,并设置需要哪些信息
    NSDateComponents * dateComponents = [greCalender components:NSCalendarUnitYear | NSCalendarUnitQuarter | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekdayOrdinal | NSCalendarUnitWeekday | NSCalendarUnitWeekOfMonth | NSCalendarUnitWeekOfYear  fromDate:[NSDate date]];

    NSLog(@"year(年份): %li", (long)dateComponents.year);
    NSLog(@"quarter(季度):%li", (long)dateComponents.quarter);
    NSLog(@"month(月份):%li", (long)dateComponents.month);
    NSLog(@"day(日期):%li", (long)dateComponents.day);
    NSLog(@"hour(小时):%li", (long)dateComponents.hour);
    NSLog(@"minute(分钟):%li", (long)dateComponents.minute);
    NSLog(@"second(秒):%li", (long)dateComponents.second);

    //  NSDateComponents返回的day, week, weekday, month, year这一类数据都是从1开始的。因为日历是给人看的,不是给计算机看的,从0开始就是个错误。
    //  默认星期天是1.可能是美国的设定吧.   Sunday:1, Monday:2, Tuesday:3, Wednesday:4,Thursday:5, Friday:6, Saturday:7
    NSLog(@"weekday(星期):%li", (long)dateComponents.weekday);
}

- (void)way_two {
    // 距离某个日期多少时间
    NSCalendar * greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    //    定义一个NSDateComponents对象,设置一个时间段
    NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];
    [dateComponentsAsTimeQantum setDay:6];

    //    在当前历法下,获取6天后的时间点
    NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
    NSLog(@"dateFromDateComponentsAsTimeQantum: %@",dateFromDateComponentsAsTimeQantum);
}

- (void)way_three {
    //    先定义一个遵循某个历法的日历对象
    NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    //    根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
    NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];
    NSLog(@"number of years:%li", (long)dateComponents.year);
}

四: 倒计时

1.获取验证码60秒倒计时: 定时器的简单实用

#import "Level_four_itemOneViewController.h"
#import "Masonry.h"

@interface Level_four_itemOneViewController ()
{
    NSTimer       *_timer;     //定时器
    NSInteger      _second;    //倒计时的时间
}
@property (nonatomic, strong) UIButton * codeButton;

@end

@implementation Level_four_itemOneViewController

#pragma mark - 生命周期
#pragma mark viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];

    [self basicSetting];

    [self sendNetWorking];

    [self initUI];
}

#pragma mark - 系统代理

#pragma mark - 点击事件
- (void)codeButtonClicked {

    // 验证手机号
    self.codeButton.userInteractionEnabled = NO;

    _second = 60;

    _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeTime) userInfo:nil repeats:YES];

}

#pragma mark 定时器调用的方法
- (void)changeTime
{

    //每一秒调用一次改方法, 每次调用,_second 减一.
    _second --;

    //修改倒计时标签文字   ->   把按钮文字改成倒计时的时间
    [self.codeButton setTitle:[NSString stringWithFormat:@"重新获取验证码(%@s)",@(_second)] forState:UIControlStateNormal];
    [self.codeButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];

    //如果时间到了 0 秒, 把定时器取消掉
    if (_second == -1)
    {
        //释放定时器
        [_timer invalidate];
        //把定时器设置成空.不然不起作用.
        _timer = nil;

        //把修改的验证码按钮调整为初始状态
        self.codeButton.userInteractionEnabled = YES;
        [self.codeButton setTitle:@"| 点击获取验证码" forState:UIControlStateNormal];
        [self.codeButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

    }
}
#pragma mark - 网络请求
- (void)sendNetWorking {

}

#pragma mark - 实现方法
#pragma mark 基本设置
- (void)basicSetting {
    self.title = @"60秒倒计时";
    self.view.backgroundColor = [UIColor whiteColor];
}

#pragma mark - UI布局
- (void)initUI {

    [self.view addSubview:self.codeButton];
    [self.codeButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.mas_equalTo(self.view);
        make.size.mas_equalTo(CGSizeMake(200, 40));
    }];
}

#pragma mark - setter & getter
- (UIButton *)codeButton {
    if (_codeButton == nil) {
        self.codeButton = [UIButton buttonWithType:UIButtonTypeCustom];

        self.codeButton.titleLabel.font = [UIFont systemFontOfSize:14];;
        [self.codeButton setTitle:@"| 点击获取验证码" forState:UIControlStateNormal];
        [self.codeButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [self.codeButton addTarget:self action:@selector(codeButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    } return _codeButton;
}

@end

2.天数倒计时 (自己下载demo看吧.链接在文章顶部.顺手给个star吧)

3.cell上天数倒计时(自己下载demo看吧.链接在文章顶部.顺手给个star吧)

使用的第三方倒计时CountDown Github地址: https://github.com/zhengwenming/CountDown

喜欢的点个赞

时间: 2024-10-03 13:13:29

iOS-掌握了时间就掌握了一切!的相关文章

iOS 获取当前时间格式化字符串

iOS 获取当前时间格式化字符串 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. // 获取系统当前时间 NSDate * date = [NSDate date]; NSDateFormatt

iOS开发自定义时间选取器

又是一年的暑假日期而至,小孩子放假,都会到在外打工的父母身边.孩子想父母,父母也思念着自己的孩子.我身边的亲戚朋友的孩子 也都来了.这个暑假又该热闹起来. 努力什么时候都不晚 我有一个表妹,今年参加完高考,对自己的成绩不是特别满意.上次我回老家,刚好她给我一起来上海.准备来上海锻炼一下. 车上我问她,准备去哪上学?她说不想上了,想打工.我没有怎么劝她,我想让她体验一下打工的生活,她就知道还是上学好. 一个高中生,出来找工作,困难可想而知.经姐姐介绍,进了一家餐厅工作.工资也不是很高.干了两天,我

关于iOS中的时间

两类 绝对时间 [NSDate date].CFAbsoluteTimeGetCurrent(),或者gettimeofday(). 返回的是从某一个时刻开始,度过的秒数.会随着用户设置的系统时间更改. 相对时间 CACurrentMediaTime 或者-[NSProcessInfo systemUptime],相对时间.重启之后,会重新计数. 参考资料 Keeping Track of Time Passed on iOS NSDate .CFAbsoluteTimeGetCurrent.C

IOS 格式化日期时间

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理.例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate da

iOS中精确时间的获取

下面是一段无法查证出处的英文和自己的翻译 A quick and easy way to measure the performance of a piece of iOS code is to dig down below all the Cocoa Touch stuff and use the low-level mach_absolute_time. This call returns a tick count that can be converted into nanoseconds

iOS保持长时间后台运行

最近做一个项目,需要让app在后台长时间运行,鉴于此项目是属于音乐类的,曾经也有听过别人说可以在app进入后台后向系统申请一个Background Task, 但是这个Task只能让app保持180s的运行时间,app就会进入休眠状态.但是可以在此Task结束时持续播放一段静默音乐,使得app一直处于‘前台’. 要播放音乐,记得勾选以下: 上代码吧(最下面有demo下载): 环境:Xcode6.1.1 & iOS SDK 8.1 demo下载地址

iOS开发之时间格式的转化

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM”的时间转化成“2014/05/12 5:08:02”,下面是具体实现代码: NSString* timeStr = @"12-May-14 05.08.02.000000 PM"; NSDateFormatter *formatter = [[NSDateFormatter alloc]

iOS 获取系统时间 及 时间比较

简单记录一下ios里面获取系统时间的方法. NSString* date; NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; [formatter setDateFormat:@"YYYY:MM:dd:hh:mm:ss"]; date = [formatter stringFromDate:[NSDate date]]; NSLog(@"YYYY:MM:dd:hh:mm:ss == %@", da

iOS 获取当前时间以及计算年龄(时间差)

获取当前时间 NSDate *now = [NSDate date]; NSLog(@"now date is: %@", now); NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarU

iOS 断当前时间是否在一天的某个时间段内。

应用中设置一般会存在这样的设置,如夜间勿扰模式,从8:00-23:00,此时如何判断当前时间是否在该时间段内.难点主要在于如何用NSDate生成一个8:00的时间和23:00的时间,然后用当前的时间跟这俩时间作对比就好了. 下面提供两条思路: 法1.用NSDate生成当前时间,然后转为字符串,从字符串中取出当前的年.月.日,然后再拼上时.分.秒,然后再将拼接后的字符串转为NSDate,最后用当前的时间跟自己生成的俩NSDate的时间点比较.(该方法比较笨,也不难,但看起来有点太菜了,看上去不怎么