首页 > 代码库 > iOS-掌握了时间就掌握了一切!
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 = http://www.mamicode.com/(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
喜欢的点个赞
iOS-掌握了时间就掌握了一切!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。