前言
-
NSDate
- NSDate 用来表示公历的 GMT 时间(格林威治时间)。是独立与任何历法的,它只是时间相对于某个时间点的时间差;NSDate 是进行日历计算的基础。
-
NSDateComponents
- NSDateComponents 封装了具体年月日、时秒分、周、季度等。将时间表示成适合人类阅读和使用的方式,通过 NSDateComponents 可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此 NSDateComponents 必须和 NSCalendar 一起使用,默认为公历。NSDateComponents 除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。可以说,要获取某个时间点在某个历法下的表示,需要 NSDateComponents; 要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要 NSDateComponents。NSDateComponents 返回的 day, week, weekday, month, year 这一类数据都是从 1 开始的。因为日历是给人看的,不是给计算机看的,从 0 开始就是个错误。
-
- NSDateFomatter 表示的时间默认以公历(即阳历)为参考,可以通过设置 calendar 属性变量获得特定历法下的时间表示。
1、NSDate 的创建
复制
NSDate *date1 = [[NSDate alloc] init];
NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:10];
NSDate *date3 = [[NSDate alloc] initWithTimeInterval:10 sinceDate:date2];
NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600];
NSDate *date5 = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:10];
NSDate *date6 = [NSDate date];
NSDate *date7 = [NSDate dateWithTimeIntervalSinceNow:10];
NSDate *date8 = [NSDate dateWithTimeInterval:10 sinceDate:date2];
NSDate *date9 = [NSDate dateWithTimeIntervalSince1970:3600];
NSDate *date10 = [NSDate dateWithTimeIntervalSinceReferenceDate:10];
NSDate *date11 = [NSDate distantFuture];
NSDate *date12 = [NSDate distantPast];
NSDate *date13 = [date6 dateByAddingTimeInterval:20];
2、NSDate 时间间隔的计算
NSDate *date1 = [NSDate date];
NSDate *date2 = [date1 dateByAddingTimeInterval:20];
NSTimeInterval interval1 = [date2 timeIntervalSinceNow];
NSTimeInterval interval2 = [date2 timeIntervalSinceDate:date1];
NSTimeInterval interval3 = [date1 timeIntervalSince1970];
NSTimeInterval interval4 = [date1 timeIntervalSinceReferenceDate];
NSTimeInterval interval5 = [NSDate timeIntervalSinceReferenceDate];
3、NSDate 时间的比较
NSDate *date1 = [NSDate date];
NSDate *date2 = [date1 dateByAddingTimeInterval:10];
BOOL bl = [date1 isEqualToDate:date2];
NSComparisonResult result = [date1 compare:date2];
NSDate *date3 = [date1 earlierDate:date2];
NSDate *date4 = [date1 laterDate:date2];
4、NSDateComponents 的创建
NSDateComponents *compt1 = [[NSDateComponents alloc] init];
[compt1 setCalendar:[NSCalendar currentCalendar]];
[compt1 setTimeZone:[NSTimeZone systemTimeZone]];
[compt1 setEra:1];
[compt1 setYear:2016];
[compt1 setMonth:3];
[compt1 setDay:1];
[compt1 setHour:00];
[compt1 setMinute:10];
[compt1 setSecond:55];
[compt1 setNanosecond:280];
[compt1 setQuarter:0];
[compt1 setWeekday:3];
[compt1 setWeekdayOrdinal:1];
[compt1 setWeekOfMonth:1];
[compt1 setWeekOfYear:10];
[compt1 setYearForWeekOfYear:2016];
NSDateComponents *compt2 = [[NSCalendar currentCalendar] components: NSCalendarUnitEra
| NSCalendarUnitYear
| NSCalendarUnitMonth
| NSCalendarUnitDay
| NSCalendarUnitHour
| NSCalendarUnitMinute
| NSCalendarUnitSecond
| NSCalendarUnitNanosecond
| NSCalendarUnitQuarter
| NSCalendarUnitWeekday
| NSCalendarUnitWeekdayOrdinal
| NSCalendarUnitWeekOfMonth
| NSCalendarUnitWeekOfYear
| NSCalendarUnitYearForWeekOfYear
| NSCalendarUnitCalendar
| NSCalendarUnitTimeZone
fromDate:[NSDate date]];
5、NSDateComponents 时间间隔的计算
NSDate *date1 = [NSDate date];
NSDate *date2 = [NSDate dateWithTimeInterval:5*60*60+75 sinceDate:date1];
NSDateComponents *compt = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute
| NSCalendarUnitSecond
fromDate:date1
toDate:date2
options:0];
6、NSDateComponents 与 NSDate 的相互转换
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *compt = [calendar components:NSCalendarUnitYear
| NSCalendarUnitMonth
| NSCalendarUnitDay
fromDate:[NSDate date]];
NSDate *date = [calendar dateFromComponents:compt];
date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];
7、NSDateComponents 与 NSDate 的计算
NSDateComponents *compt = [[NSDateComponents alloc] init];
[compt setDay:25];
[compt setHour:4];
[compt setMinute:66];
NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:compt toDate:[NSDate date] options:0];
date = [date dateByAddingTimeInterval:[[NSTimeZone systemTimeZone] secondsFromGMTForDate:date]];
G -- 纪元 一般会显示公元前(BC)和公元(AD)
y -- 年 假如是2013年,那么 yyyy=2013,yy=13
M -- 月 假如是3月,那么 M=3,MM=03,MMM=Mar,MMMM=March;假如是11月,那么M=11,MM=11,
MMM=Nov,MMMM=November
w -- 一年中的第几周 假如是1月8日,那么 w=2(这一年的第二个周)
W -- 一个月中的第几周 与日历排列有关,假如是2013年4月21日,那么 W=4(这个月的第四个周)
F -- 月份包含的周 与日历排列无关,和上面的 W 不一样,F 只是单纯以7天为一个单位来统计周,例如7号一定是第一个周,
15号一定是第三个周,与日历排列无关。
D -- 一年中的第几天 假如是1月20日,那么 D=20(这一年的第20天);假如是2月25日,那么 D=31+25=56(这一年的第56天)
d -- 一个月中的第几天 假如是5号,那么 d=5,dd=05 假如是15号,那么 d=15,dd=15
E -- 星期几 假如是星期五,那么 E=Fri,EEEE=Friday
a -- 上午(AM)/下午(PM)
H -- 24小时制 显示为0--23,假如是午夜00:40,那么 H=0:40,HH=00:40
h -- 12小时制 显示为1--12,假如是午夜00:40,那么 h=12:40
K -- 12小时制 显示为0--11,假如是午夜00:40,那么 K=0:40,KK=00:40
k -- 24小时制 显示为1--24,假如是午夜00:40,那么 k=24:40
m -- 分钟 假如是5分钟,那么 m=5,mm=05;假如是45分钟,那么 m=45,mm=45
s -- 秒 假如是5秒钟,那么 s=5,ss=05;假如是45秒钟,那么 s=45,ss=45
S -- 毫秒 一般用 SSS 来显示
z -- 时区 表现形式为 GMT+08:00
Z -- 时区 表现形式为 +0800
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"G yyyy-MM-dd E D F w W a z HH:mm:ss.SSS"];
NSString *str = [formatter stringFromDate:[NSDate date]];
9、1437494603 (秒) 格式 转 YYYY-MM-dd HH:mm:ss 格式
NSDate *date = [NSDate dateWithTimeIntervalSince1970:1437494603];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *string = [formatter stringFromDate:date];
10、NSDate 与 NSString 的相互转换
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒 'iOS Date Test'"];
NSDate *date = [formatter dateFromString:@"2016年01月12日 1点8分50秒"];
NSString *str = [formatter stringFromDate:date];
11、时区差值转换
NSDate *date = [NSDate date];
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMT];
date = [date dateByAddingTimeInterval:interval];
12、其他问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix