iOS-掌握了时间就掌握了一切!
一. 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 = * + 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]*;
NSTimeInterval endTime = [endDate timeIntervalSince1970]*;
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 = ;
NSArray * timeArray = [self calculateTimeQuantumWithValue:value];
NSLog(@"时间: timeArray = %@",timeArray);
}
// 计算一个时间段是多少天 多少时分秒
- (NSArray *)calculateTimeQuantumWithValue:(NSTimeInterval)time {
long value = (long)time;
// 计算一天/一小时/一分钟/一秒 包含多少秒
long day = * * ;
long hour = * ;
long minute = ;
long second = ;
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天后的时间点
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:];
NSLog(@"dateFromDateComponentsAsTimeQantum: %@",dateFromDateComponentsAsTimeQantum);
}
- (void)way_three {
// 先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// 根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitYear fromDate:[NSDate dateWithTimeIntervalSince1970:] toDate:[NSDate date] options:];
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 = ; _timer = [NSTimer scheduledTimerWithTimeInterval: 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 == -)
{
//释放定时器
[_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(, ));
}];
} #pragma mark - setter & getter
- (UIButton *)codeButton {
if (_codeButton == nil) {
self.codeButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.codeButton.titleLabel.font = [UIFont systemFontOfSize:];;
[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-掌握了时间就掌握了一切!的更多相关文章
- Swift3.0 iOS获取当前时间 - 年月日时分秒星期
Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...
- iOS 获取当前时间格式化字符串
iOS 获取当前时间格式化字符串 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保 ...
- iOS NSDate等时间类的使用
一.NSDate NSDate对象用来表示一个具体的时间点. NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体. NSDate存储的是GMT时间,使用的时候会根据 ...
- iOS之TimeLine(时间轴)的实现
这是一个关于OC时间轴的简单实现,我认为重要的是思路. 感谢作者:Cyandev 的文章<iOS 实现时间线列表效果>给的思路.这里先附上Objective-C的代码实现,有时间再去试试S ...
- 关于iOS中的时间
两类 绝对时间 [NSDate date].CFAbsoluteTimeGetCurrent(),或者gettimeofday(). 返回的是从某一个时刻开始,度过的秒数.会随着用户设置的系统时间更改 ...
- iOS开发之时间格式的转化
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM” ...
- iOS - OC NSDate 时间
前言 NSDate @interface NSDate : NSObject <NSCopying, NSSecureCoding> NSDate 用来表示公历的 GMT 时间(格林威治时 ...
- iOS - Swift NSDate 时间
前言 NSDate public class NSDate : NSObject, NSCopying, NSSecureCoding NSDate 用来表示公历的 GMT 时间(格林威治时间).是独 ...
- iOS中精确时间的获取
下面是一段无法查证出处的英文和自己的翻译 A quick and easy way to measure the performance of a piece of iOS code is to di ...
- 【safari挖的那些坑】iOS safari 浏览器 时间乱码(ios时间显示NaN) 问题解决
通常 iOS下时间错误表现形式 问题一: 这个界面运用了大量的日期类型的计算,当我们用JavaScript实例化一个日期对象时,我们可以这样用: var date =new Date(); 上面这段代 ...
随机推荐
- 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目
前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...
- 2016/11/16 周三 <使用LocalStore记住用户密码方法示例>
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- SQL Server出现错误: 4014
SQL Server出现错误: 4014 线下的测试机器老是报错,从errorlog里看到大量的4014错误 A fatal error occurred , output error: ). 错误: ...
- 常用SQL[ORACLE]
1.常用系统函数 2.常用sql语句 3.一些定义和关键字 4.需要注意点 1.常用系统函数 ↑ --decode decode(column,if_value,value,elseif_ ...
- 有一个团队协同工具,叫Worktile
项目管理,本是一个老生常谈的话题,曾几何时大碗云集在这个市场,其中不乏出现像微软.SAP.IBM.用友这样的名字.复杂而又冗繁的流程控制,让人们划分成两类人,一类是会使用这些工具和系统的人,另一类是不 ...
- 为什么可以说Java语言是准动态语言?
什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...
- C#设计模式-代理模式
在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替 ...
- salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List
salesforce给我们提供了标准的页面,比如标准的页面包括标准的列表和标准的详细页视图.有的时候我们想要自定义视图,比如做一个项目的时候不希望使用者直接通过ID查看到标准的详细页,而是跳转到指定处 ...
- iOS-几大框架的介绍
1.Objective-C之Foundation框架 概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objectiv ...
- MFC的定时器OnTimer
本文总结来源出自鸡啄米,感谢鸡啄米.来源:http://www.jizhuomi.com/software/232.html 定时器简介 定时器,可以帮助开发者或者用户定时完成某项任务.在使用定时器时 ...