~~~~我的生活,我的点点滴滴!!
#pragma mark
NSDate创建(只举例类方法,实例方法一样)
// 返回当前时间(GMT,0时区,格林尼治时间)
+ (id)date;
// 返回以当前时间为基准,然后过了secs秒的时间
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
// 返回以2001/01/01 GMT为基准,然后过了secs秒的时间
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti;
// 返回以1970/01/01 GMT为基准,然后过了secs秒的时间
+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
// 根据时间间隔和指定的date,获得对应的时间
+ (instancetype)dateWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)date;
// 返回很多年以后的未来的某一天
+ (id /* NSDate * */)distantFuture;
// 返回很多年以前的某一天
+ (id /* NSDate * */)distantPast;
#pragma mark
NSDate取回时间间隔
// 以anotherDate为基准时间,返回实例保存的时间与anotherDate的时间间隔
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
// 以当前时间(now)为基准时间,返回实例保存的时间与当前时间(now)的时间间隔
- (NSTimeInterval)timeIntervalSinceNow;
// 以 1970/01/01 GMT 为基准时间,返回实例保存的时间与 1970/01/01 GMT 的时间间隔
- (NSTimeInterval)timeIntervalSince1970;
// 以 2001/01/01 GMT 为基准时间,返回实例保存的时间与 2001/01/01 GMT 的时间间隔
- (NSTimeInterval)timeIntervalSinceReferenceDate;
// 以 2001/01/01 GMT 为基准时间,返回当前时间与 2001/01/01 GMT 的时间间隔
+ (NSTimeInterval)timeIntervalSinceReferenceDate;
#pragma mark
NSDate日期比较
// 与anotherDate相比,返回比较早的那个日期
- (NSDate *)earlierDate:(NSDate *)anotherDate;
// 与anotherDate相比,返回比较晚的那个日期
- (NSDate *)laterDate:(NSDate *)anotherDate;
// 与anotherDate相比,相同返回YES
- (BOOL)isEqualToDate:(NSDate *)otherDate;
// 用于排序时调用:
~ 当实例保存的日期值与other相同时返回NSOrderedSame
~ 当实例保存的日期值晚于other返回NSOrderedDescending
~ 当实例保存的日期值早于other返回NSOrderedAscending
- (NSComparisonResult)compare:(NSDate *)other;
#pragma mark
@NSString和NSDate的相互转化(NSDateFormatter的格式串详解)
1、字符串转换为日期
// 实例化一个NSDateFormatter对象
NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init];
// 设定时间格式,要注意跟下面的dateString匹配,否则日起将无效
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date =[dateFormat dateFromString:@"2013-3-11 10:00:01"];
2、日期转为字符串
// 实例化一个NSDateFormatter对象
NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
// 设置Locale,星期几会以中文显示
dateFormat.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
// 设定时间格式(后面跟 a,默认为中文)
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss a"];
// 礼拜几,上下午等显示为英文,把AM,PM换成上午,下午显示为中文
[dateFormat setAMSymbol:@"AM"];
[dateFormat setPMSymbol:@"PM"];
// 系统默认格式
[dateFormat setDateStyle:NSDateFormatterFullStyle];
[dateFormat setTimeStyle:NSDateFormatterFullStyle];
//求出当天的时间字符串,当更改时间格式时,时间字符串也能随之改变
NSString *dateString = [dateFormat stringFromDate:[NSDate date]];
@NSDateFormatter的格式串对应表
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 (每月的第几周, 一周的第一天为周一)
g: Julian Day Number (number of days since 4713 BC January 1) 未知
G~GGG: BC/AD (Era Designator Abbreviated) 未知
GGGG: Before Christ/Anno Domini 未知
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) 第几月(3)
LLL: Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec 月份简写(3月)
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(同LLLL)
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) 未知
u: (0 padded Year) 未知
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个数字的年份
Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的
YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year) 这个年份未知干嘛用的
z~zzz: (Specific GMT Timezone Abbreviation) 指定GMT时区的编写
zzzz: (Specific GMT Timezone Name) Z: +0000 (RFC 822 Timezone) 指定GMT时区的名称
UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期、时间和持续时长的输入。他固定高度为216没法改变,
他没有提供更改里面字体颜色或字体大小等操作的接口,虽然很不爽,但是还算好用。
UIDatePicker 依赖于 NSDate 类。
一、创建日期/时间选取器
UIDatePicker 使用起来比标准 UIPickerView 更简单。他会根据你指定的日期范围创建自己的数据源,使用它只需要创建一个对象:
UIDatePicker *datePicker = [ [ UIDatePicker alloc] initWithFrame:CGRectMake(0.0,0.0,0.0,0.0)];
默认情况下选取会显示目前的日期和时间,并提供几个表盘,分别显示可以选择的月份和日期、小时、分钟、以及上午、下午。
因此用户默认可以选择任何日期和时间的组合。
二、日期选取器模式
日期/时间选取器支持4种不同模式的选择方式,通过设置 datePickerMode 属性,可以定义选择模式:
datePicker.datePickerMode = UIDatePickerModeTime;
支持的模式:
typedef enum {
UIDatePickerModeTime, 仅显示时间,不显示日期
UIDatePickerModeDate, 仅显示日期,不显示时间
UIDatePickerModeDateAndTime, 同时显示日期和时间
UIDatePickerModeCountDownTimer 倒计时器 小时和分
} UIDatePickerMode;
三、时间间隔
你可以将分钟表盘设置为以不同的时间间隔来显示分钟,前提是该间隔要能够让60整除, 默认最小间隔是一分钟,如果要使用不同的间隔,
需要改变 minuteInterval属性:
datePicker.minuteInterval = 5;
四、日期范围
你可以通过设置mininumDate 和 maxinumDate 属性,来指定使用的日期范围。如果用户试图滚动到超出这一范围的日期,表盘会回滚到最近
的有效日期,两个方法都需要NSDate对象作参数:
NSDate* minDate = [[NSDate alloc]initWithString:@"1900-01-01 00:00:00 +0800"];
NSDate* maxDate = [[NSDate alloc]initWithString:@"2099-01-01 00:00:00 +0800"];
datePicker.minimumDate = minDate;
datePicker.maximumDate = maxDate;
如果两个日期范围属性中任何一个未被设置,则默认行为将会允许用户选择过去或未来的任意日期。这在某些情况下很有用处,比如,当选择
生日时,可以是过去的任意日期,但终止于当前日期。如果你希望设置默认显示的日期,可以使用date属性:
datePicker.date = minDate;
此外,你还可以用 setDate 方法。如果选择了使用动画,则表盘会滚动到你指定的日期:
[ datePicker setDate:maxDate animated:YES];
五、显示日期选择器
[ self.view addSubview:datePicker];
需要注意的是,选取器的高度始终是216像素,要确定分配了足够的空间来容纳。
六、读取日期
NSDate* _date = datePicker.date;
由于日期选择器是 UIControl的子类 (与UIPickerView不同),你还可以在UIControl类的通知结构中挂接一个委托:
[ datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged ];
只要用户选择了一个新日期,你的动作类就会被调用:
-(void)dateChanged:(id)sender
{
UIDatepicker* control = (UIDatePicker*)sender;
NSDate* _date = control.date;
/*添加你自己响应代码*/
}
但由于DatePicker没有提供任何可以改变其样式的接口,如果想做成其他模式或改变里面某元素的颜色,还得使用PickView自定义。
实例:倒计时器
将UIDatePicker的模式设置为Count Down Timer,即可让该控件作为倒计时器使用。当将UIDatePicker作为倒计时器使用时,程序还应该
启动一个定时器定期更新该UIDatePicker的剩余时间。由此可见,把UIDatePicker作为Count Down Timer模式使用时,该控件最重要的属
性就是countDownDuration,该属性代表该倒计时器的剩余时间,程序既可通过countDownDuration属性获取该控件的剩余时间,也可通过
修改该属性来改变该控件显示的剩余时间。
看下面的例子,界面上一个button,一个datepicker
NSTimer* timer;
NSInteger leftSeconds; // ①
- (void)viewDidLoad
{
[super viewDidLoad];
// 设置使用Count Down Timer模式
self.countDown.datePickerMode = UIDatePickerModeCountDownTimer;
}
- (IBAction)clicked:(id)sender
{
// 获取该倒计时器的剩余时间
leftSeconds = self.countDown.countDownDuration;
// 禁用UIDatePicker控件和按钮
self.countDown.enabled = NO;
[sender setEnabled:NO];
// 初始化一个字符串
NSString *message = [NSString stringWithFormat:
@"开始倒计时?您还剩下【%d】秒", leftSeconds];
// 创建一个UIAlertView(警告框)
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"开始倒计时?"
message:message
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
// 显示UIAlertView控件
[alert show];
// 启用计时器,控制每隔60秒执行一次tickDown方法
timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self selector:@selector(tickDown)
userInfo:nil repeats:YES];
}
- (void) tickDown
{
leftSeconds -= 60; // 将剩余时间减少60秒
self.countDown.countDownDuration = leftSeconds; // 修改UIDatePicker的剩余时间
if(leftSeconds <= 0) // 如果剩余时间小于或等于0
{
// 取消定时器
[timer invalidate];
// 启用UIDatePicker控件和按钮
self.countDown.enabled = YES;
self.startBn.enabled = YES;
}
}
clicked:方法,该方法将启动一个定时器控制每隔60秒执行一次tickDown方法,而tickDown方法每执行一次,程序就将倒计时器的剩余
时间减少60,并动态修改倒计时器的剩余时间,这样就可让UIDatePicker显示的剩余时间减少。