前言

  • 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)

iOS - Swift NSDate 时间的更多相关文章

  1. iOS - OC NSDate 时间

    前言 NSDate @interface NSDate : NSObject <NSCopying, NSSecureCoding> NSDate 用来表示公历的 GMT 时间(格林威治时 ...

  2. iOS:NSDate的主要几种时间形式

    NSDate:时间的获取和操作 1.获取当前时间 //获取当前日期 NSDate *date = sender.date; NSLog(@"%@",date); 2.将date转换 ...

  3. ios开发之--时间格式化

    字符串转时间 iOS 中 NSDate 是时间管理类,这里获取到的时间是 UTC 时间,可以根据需要转换成任意地区的时间. NSFormatter 类是时间格式化类,可以根据指定的格式.地区将指定的时 ...

  4. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  5. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

  6. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

  7. iOS 获取当前时间格式化字符串

    iOS 获取当前时间格式化字符串 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保 ...

  8. Swift3.0 iOS获取当前时间 - 年月日时分秒星期

    Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...

  9. NSdate 时间格式

    NSdate 时间格式 NSTimeInterval 时间间隔 基本单位 秒 NSDateFormatter 时间格式器 用于日期对象的格式化或字符串解析为日期对象 日期格式如下: y  年 M  年 ...

随机推荐

  1. 【PHP操作sphinx】

    [index.php] [find.php] <?php header("Content-type:text/html;charset=utf-8"); $keyword = ...

  2. 【PHP设计模式 07_ZeRenLian.php】责任链模式

    <?php /** * [责任链模式] * 情景设置:根据不同的需求,去找相应级别的责任人解决问题 */ header("Content-type: text/html; charse ...

  3. Oracle中左右外连接详解

    数据表的连接有:  1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两 ...

  4. python:正则表达式 re

    #re正则的用法:match匹配从开头 search 取一个就回来了,findout取所以匹配的,slit分割 sub替换 #-*- coding:utf8 -*- # Auth:fulimei #r ...

  5. Linux hrtimer分析(2)

    http://blog.csdn.net/angle_birds/article/details/17375901 本文介绍Linux2.6.29中,配置高精度模式的hrtimer与未配置高精度模式时 ...

  6. SlickGrid example 7:鼠标事件

    响应鼠标事件,可以左键快捷选择切换选项,可右键弹出菜单栏.   代码: <!DOCTYPE HTML> <html> <head> <meta http-eq ...

  7. 哈希-4 Values whose Sum is 0 分类: POJ 哈希 2015-08-07 09:51 3人阅读 评论(0) 收藏

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 17875 Accepted: ...

  8. H - Solve this interesting problem 分类: 比赛 2015-07-29 21:06 15人阅读 评论(0) 收藏

    Have you learned something about segment tree? If not, don't worry, I will explain it for you.  Segm ...

  9. Unity-Animator深入系列---目标匹配Target Matching

    回到 Animator深入系列总目录 一开始会理所当然的觉得,匹配是这样的: 但结果却是这样的(右边的Cube是匹配目标): 感觉这个接口应该是专门为攀爬之类的动画准备的,属于被动匹配位置,移动整个对 ...

  10. canvas动画基础

    setInterval( function(){ render( context ); update(); } , ); window.requestAnimFrame = (function() { ...