Swift 3 中的 Date 学习

参考文章 Swift 的 NSDate 初学者指南

Date 常见操作

① 日期间的比较
② 计算过去或未来的日期
③ 计算不同日期间的差值
④ 将一个日期进行拆解,并对各部分访问(天、月、时、分、秒等)

Date 基本概念

NSDate 是类,但是 Swift 3中的 Date 是 Struct,按文章的描述:

NSDate 对象。从程序角度来说这种对象包含了对日(date)和时(time)两者的描述,所以它不仅仅可以帮我们处理「日」,还可以帮我们处理「时」。对于 NSDate 对象本身来说是没有格式(formatting)这个概念的;和其他类中的所有属性一样,可以把日和时看做是属性(properties)。只有在将一个日期对象转换成一个字符串时,格式这个概念才会派上用场,下面的内容里我们会看到很多关于这个的细节。通常来讲,记住你所需要的就是 NSDate 这个类,无论你只关心「日」、「时」或者两者。

Date 转换成 String

首先获取当前时间

let currentDate = Date()

然后初始化一个 DateFormatter,用作 date 和 string 的转换

let dateFormatter = DateFormatter()

DateFormatter 里有一个位置属性 locale,可以设置成当前位置

dateFormatter.locale = Locale.current

也可以指定位置

dateFormatter.locale = Locale(identifier: "zh_cn")

还有一个属性是 dateStyle 用作输出指定格式的 String ,有 none short medium long full这几个指定值

dateFormatter.dateStyle = DateFormatter.Style.long

设置完格式,就可以做转换了

var convertDate = dateFormatter.string(from: currentDate)

输出结果是 2016年11月12日

使用 Date format specifier

即对 DateFormatter 更详细的自定义,文中是这么解释的:

为了正确的设置一个 date format,一定要用一组分类符(specifier) 。Specifier 不过是一些简单的字符,这些字符对 date formatter 对象来说有着特定的意义。在我给你具体的例子之前,先列出来一些在接下来的代码中会使用到的format specifier:
 
EEEE:表示星期几(如 Monday)。使用 1-3 个字母表示周几的缩略写法。
MMMM:月份的全写(如 October)。使用 1-3 个字母表示月份的缩略写法。
dd:表示一个月里面日期的数字(如 09 或 15)。
yyyy:4 个数字表示的年(如 2015)。
HH:2 个数字表示的小时(如 08 或 19)。
mm:2 个数字表示的分钟(如 05 或者 54)。
ss:2 个数字表示的秒。
zzz:3 个字母表示的时区(如 GMT)。
GGG:BC 或者 AD。

举例

dateFormatter.dateFormat = "HH:mm:ss"
convertDate = dateFormatter.string(from: currentDate)

输出是 21:06:25

String 转换成 Date

把有既定格式的字符串转换成一个 NSDate 对象的关键是要对 date formatter 的 dateFormat 属性做出正确设置,然后调用 dateFromString: 方法。

var dateString = "24-12-2015 23:59"
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var newDate = dateFormatter.date(from: dateString)

拆分一个日期对象

与文章提到的方法不同,因为 Apple 在推动去 NS 化,所以方法变为如下(来源: http://stackoverflow.com/a/38248942):

let hour = calendar.component(.hour, from: currentDate)
let minutes = calendar.component(Calendar.Component.minute, from: currentDate)
let seconds = calendar.component(.second, from: currentDate)
print("hours = \(hour):\(minutes):\(seconds)")

输出为 hours = 21:16:51

从 date components 转换到日期对象:

var components = DateComponents()
components.day = 5
components.hour = 01
components.year = 2016
components.hour = 19
components.minute = 30
let componentsDate = calendar.date(from: components)

时区转换

用到 Components 的 TimeZone 属性,所有时区缩写在这里

components.timeZone = TimeZone(abbreviation: "CST")
componentsDate = calendar.date(from: components)

比较日期和时间

同样,因为 Swift 3 的原因,实现方法也和原文章有出入

dateFormatter.dateFormat = "yyyy-MM-dd"
var dateAsString = "1989-12-10"
var date1 = dateFormatter.date(from: dateAsString)
dateAsString = "1990-01-06"
var date2 = dateFormatter.date(from: dateAsString)

if date1! > date2! {
    print ("Date1 is later than Date2")
}else {
    print ("Date1 is earlier than Date2")
}

输出是 Date1 is earlier than Date2 ,还可以使用的操作符包括 == != 等.

计算未来或过去的日期

因为 Swift 3 的原因,这里代码还是有些不同:

第一种方法:

let monthsToAdd = 2
let daysToAdd = 5

var calcuateDate = Calendar.current.date(byAdding: Calendar.Component.month, value: monthsToAdd, to: currentDate)
calcuateDate = Calendar.current.date(byAdding: Calendar.Component.day, value: daysToAdd, to: calcuateDate!)

第二种方法:

var newDateComponent = DateComponents()
newDateComponent.month = monthsToAdd
newDateComponent.day = daysToAdd

let sencondCalcuateDate = Calendar.current.date(byAdding: newDateComponent, to: currentDate)

计算日期差值

方法1:

var differentDateComponent = DateComponents()
differentDateComponent = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date1!, to: date2!)
print(differentDateComponent)

方法2 用到 DateComponentsFormatter 初始化如下:

let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = .full

使用方法是:

let interval = date2?.timeIntervalSince(date1!)
dateComponentsFormatter.string(from: interval!)

方法3:

dateComponentsFormatter.allowedUnits = [.year, .month, .day, .hour, .minute, .second]
let autoFormattedDifference = dateComponentsFormatter.string(from: date1!, to: date2!)
Comments
Write a Comment