iOS - Swift NSDate 时间

简介: 前言NSDate public class NSDate : NSObject, NSCopying, NSSecureCodingNSDate 用来表示公历的 GMT 时间(格林威治时间)。

前言

  • NSDate

        public class NSDate : NSObject, NSCopying, NSSecureCoding
    • NSDate 用来表示公历的 GMT 时间(格林威治时间)。是独立与任何历法的,它只是时间相对于某个时间点的时间差;NSDate 是进行日历计算的基础。
  • NSDateComponents

        public class NSDateComponents : NSObject, NSCopying, NSSecureCoding 
    • NSDateComponents 封装了具体年月日、时秒分、周、季度等。将时间表示成适合人类阅读和使用的方式,通过 NSDateComponents 可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此 NSDateComponents 必须和 NSCalendar 一起使用,默认为公历。NSDateComponents 除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。可以说,要获取某个时间点在某个历法下的表示,需要 NSDateComponents;要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要 NSDateComponents。NSDateComponents 返回的 day, week, weekday, month, year 这一类数据都是从 1 开始的。因为日历是给人看的,不是给计算机看的,从 0 开始就是个错误。
  • NSDateFormatter

        public class NSDateFormatter : NSFormatter
    • NSDateFomatter 表示的时间默认以公历(即阳历)为参考,可以通过设置 calendar 属性变量获得特定历法下的时间表示。

1、NSDate 的创建

    // 当前时间值,GMT 时间
    let date1:NSDate = NSDate()
    
    // 当前时间加 n 秒后的值
    let date2:NSDate = NSDate(timeIntervalSinceNow: 10)
    
    // 某个时间增加 n 秒后的值
    let date3:NSDate = NSDate(timeInterval: 10, sinceDate: date2)
    
    // 从 1970-01-01 00:00:00 (GMT) 增加 n 秒后的值
    let date4:NSDate = NSDate(timeIntervalSince1970: 3600)
    
    // 从 2001-01-01 00:00:00 (GMT) 增加 n 秒后的值
    let date5:NSDate = NSDate(timeIntervalSinceReferenceDate: 10)
    
    // 未来某一个随机时间
    let date6:NSDate = NSDate.distantFuture()
    
    // 过去某一个随机时间
    let date7:NSDate = NSDate.distantPast()
    
    // 某个时间增加 n 秒后的值
    let date8:NSDate = date5.dateByAddingTimeInterval(20)

2、NSDate 时间间隔的计算

    let date1 = NSDate()
    let date2 = date1.dateByAddingTimeInterval(20)
        
    // 实例保存的时间 与 当前时间 的时间间隔,单位 秒
    let interval1:NSTimeInterval = date2.timeIntervalSinceNow
    
    // 实例保存的时间 与 指定时间 的时间间隔,单位 秒
    let interval2:NSTimeInterval = date2.timeIntervalSinceDate(date1)
    
    // 实例保存的时间 与 1970-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
    let interval3:NSTimeInterval = date1.timeIntervalSince1970
    
    // 实例保存的时间 与 2001-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
    let interval4:NSTimeInterval = date1.timeIntervalSinceReferenceDate
    
    // 当前时间 与 2001-01-01 00:00:00 (GMT) 的时间间隔,单位 秒
    let interval5:NSTimeInterval = NSDate.timeIntervalSinceReferenceDate()

3、NSDate 时间的比较

    let date1 = NSDate()
    let date2 = date1.dateByAddingTimeInterval(20)
        
    // 判断两个时间是否相等
    let bl:Bool = date1.isEqualToDate(date2)
    
    // 比较两个时间大小
    let result:NSComparisonResult = date1.compare(date2)
    
    // 比较两个时间,返回 较早的时间
    let date3 = date1.earlierDate(date2)
    
    // 比较两个时间,返回 较晚的时间
    let date4 = date1.laterDate(date2)

4、时区差值转换

    // 得到当前时间(世界标准时间 UTC/GMT)
    var date:NSDate = NSDate()
    
    // 设置系统时区为本地时区
    let zone:NSTimeZone = NSTimeZone.systemTimeZone()
    
    // 计算本地时区与 GMT 时区的时间差
    let second:Int = zone.secondsFromGMT
    
    // 在 GMT 时间基础上追加时间差值,得到本地时间
    date = date.dateByAddingTimeInterval(NSTimeInterval(second))

5、NSDateComponents 的创建

    // 由手动设置创建
    
    let compt1:NSDateComponents = NSDateComponents()
        
    // 日历
    compt1.calendar = NSCalendar.currentCalendar()

    // 时区
    compt1.timeZone = NSTimeZone.systemTimeZone()
        
    compt1.era = 1                   // 纪元
    compt1.year = 2016               // 年
    compt1.month = 3                 // 月
    compt1.day = 1                   // 日
    compt1.hour = 10                 // 时
    compt1.minute = 12               // 分
    compt1.second = 55               // 秒
    compt1.nanosecond = 280          // 微妙
    compt1.quarter = 0               // 刻钟
        
    compt1.weekday = 3               // 周几
    compt1.weekdayOrdinal = 1        // 指定日期为本月的第几个星期几
    compt1.weekOfMonth = 1           // 指定日期为本月的第几周
    compt1.weekOfYear = 10           // 指定日期为本年的第几周
    compt1.yearForWeekOfYear = 2016  //

    //  由已知 date 创建
    /*
        只有明确指定了 unitFlags,NSDateComponents 相应的那一部分才有值。在 Swift 2.2 中不能使用 “|” 连接两个 Unit 枚举值
    */
    
    let flag:NSCalendarUnit = [.Era, .Year, .Month, .Day, .Hour, .Minute, .Second, .Nanosecond, .Quarter, .Weekday, 
                               .WeekdayOrdinal, .WeekOfMonth, .WeekOfYear, .WeekOfYear, .Calendar, .TimeZone]    
    
    let compt2:NSDateComponents = NSCalendar.currentCalendar().components(flag, fromDate: NSDate())

6、NSDateComponents 时间间隔的计算

    let date1:NSDate = NSDate()
    let date2:NSDate = NSDate(timeInterval: 5*60*60+75, sinceDate: date1)
        
    let flag:NSCalendarUnit = [.Minute, .Second]
        
    // 参数 options 不能为 0 ,0 不是一个有效的值。对于没有选项,使用 NSCalendarOptions(rawValue: 0) 
    let compt:NSDateComponents = NSCalendar.currentCalendar().components(flag, 
                                                                fromDate: date1, 
                                                                  toDate: date2, 
                                                                 options: NSCalendarOptions(rawValue: 0))

7、NSDateComponents 与 NSDate 的相互转换

    let calendar:NSCalendar = NSCalendar.currentCalendar()
        
    // NSDate 转 NSDateComponents
    let compt:NSDateComponents = calendar.components([.Year, .Month], fromDate: NSDate())
        
    // NSDateComponents 转 NSDate
            
        // 转换时间时,使用默认的时区 GMT 时区
        var date:NSDate = calendar.dateFromComponents(compt)!

        // 得到本地时间,避免时区问题
        let timeInterval = NSTimeZone.systemTimeZone().secondsFromGMT

        date = date.dateByAddingTimeInterval(NSTimeInterval(timeInterval))

8、NSDateComponents 与 NSDate 的计算

    let compt:NSDateComponents = NSDateComponents()
    compt.day = 25
    compt.hour = 11
    compt.minute = 12
        
    // NSDate 加上 NSDateComponents 表示的一段时间
    var date:NSDate = NSCalendar.currentCalendar().dateByAddingComponents(compt, 
                                                                   toDate: NSDate(), 
                                                                  options: NSCalendarOptions(rawValue: 0))!
        
    date = date.dateByAddingTimeInterval(NSTimeInterval(NSTimeZone.systemTimeZone().secondsFromGMT))

9、NSDateFormatter 的时间格式化

  • 使用 NSDateFormatter 转换时间字符串时,默认的时区是系统时区,例如在中国一般都是北京时间(+8),如果直接转换会导致结果相差8小时,所以一般的做法是先指定时区为GMT标准时间再转换。
    /*
        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
    */
        
    let formatter:NSDateFormatter = NSDateFormatter()
        
    // 设置时区,不设置时默认的时区是系统时区(GMT+8)
    formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    
    // 设置日期格式,以字符串表示的日期形式的格式
    formatter.dateFormat = "G yyyy-MM-dd E D F w W a z HH:mm:ss.SSS"
    
    // 格式化日期,GMT 时间,NSDate 转 NSString
    let str:String = formatter.stringFromDate(NSDate())

10、1437494603 (秒) 格式 转 YYYY-MM-dd HH:mm:ss 格式

    // 计算日期
    let date:NSDate = NSDate(timeIntervalSince1970: 1437494603)
    
    // 创建时间戳
    let formatter:NSDateFormatter = NSDateFormatter()
    
    // 设置日期格式,以字符串表示的日期形式的格式
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    
    // 转换成指定的格式
    let str:String = formatter.stringFromDate(date)

11、NSDate 与 NSString 的相互转换

    let formatter:NSDateFormatter = NSDateFormatter()
        
    // 设置时区,不设置时默认的时区是系统时区(GMT+8)
    formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
    
    // 加入一些别的英文字符串时,需用单引号来引入
    formatter.dateFormat = "yyyy年MM月dd日 HH点mm分ss秒 'iOS Date Test'"
                    
    // NSString 转 NSDate
    let date:NSDate = formatter.dateFromString("2016年01月12日 1点8分50秒")!
        
    // NSDate 转 NSString
    let str:String = formatter.stringFromDate(date)
目录
相关文章
|
3月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
102 1
|
4月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
156 3
|
7天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
16 2
|
13天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
35 9
|
23天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
41 1
|
27天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
50 5
|
1月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
2月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
46 4
|
2月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。