iOS技术专题互联网科技今日看点

SwiftDate 中文文档

2016-12-14  本文已影响1726人  Mee_Leo

SwiftDate概况

从Swift发布起,我们就没有放弃使用Swift。

当然,我们希望在项目能够轻松自如地管理日期和时区,所以创建SwiftDate这个类库。有了“她”在Swift里面优雅地处理时间。

在iOS、macOS、watchOS、tvOS上,以及Swift兼容的平台上(Linux)都能完美运行!

此外,这个类库是免费的,开源的!

最新发布版本

最新版本是4.0.3(Swift3)
最新更新时间:2016-10-03
更新日志:Read CHANGELOG

获取最新版本

老版本

如果你使用的是swift2.2或者swift2.3,你可以到GitHub page

主要特点

这部分内容是swiftdate里面主要特点的一大亮点。

环境要求

目前官方的版本是v4,一些要求:

安装

SwiftDate支持多种安装方式。

CocoaPods安装方式

CocoaPods是一个Objective-C和Swift的依赖管理器。

安装CocoaPods命令:

$ gem install cocoapods

SwiftDate 4.+的版本需要使用CocoaPods 1.0.1+。

Podfile文件

在Xcode项目中引入SwiftDate,编辑Podfile新增:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'TargetName' do
pod 'SwiftDate', '~> 4.0'
end

Carthage安装方式

Carthage是一种非集成的依赖管理器,构建依赖,并提供二元框架。

homebrew安装Carthage

$ brew update
$ brew install carthage

在Xcode项目中使用Carthage引入SwiftDate,只需要在Cartfile中新增:

github "malcommac/SwiftDate" ~> 4.0

Swift Package Manager安装

目前还不支持!

Fork us on GitHub

SwiftDate是开源的类库,源码托管在GitHub上。

👇下面的姿势可以为SwiftDate作贡献:

Authors & License

SwiftDate是由Daniele Margutti创建并维护,其中项目的一个主要贡献者是Jeroen Houtzager

欢迎为开源项目作出贡献!

此库的源代码遵循MIT License, 你可以没有任何限制地在商业项目中使用!

唯一的要求就是增加一行说明:

Date and Time Management is provided by SwiftDate - http://www.swift-date.com
Created by Daniele Margutti and licensed under MIT License.

Your App & SwiftDate

如果你有兴趣,可以整理出使用SwiftDate这个类库的项目。可以在GitHub上开一个issue,提供你的项目名字和链接,我们将会添加到本网站上!


主要概念

Date 和 Absolute Time

Date是日期和时间处理的基础类。在iOS内部,时间以从 2001年1月1日00:00 UTC 的秒数,作为绝对值存储,Date对此进行封装,并提供相关方法。

世界各地的在同一个时刻,你可以认为是同一个物体(除非出现了一个新的星球时间系统)。但是附加上各地不同的表述和计算方式,时间就变得略微复杂。

绝对时间一种通俗的概念:在美国的 A 正在跟在迪拜的 B 进行通电话,这个时刻就可以称为绝对时间;在同一时刻都会有这样的通话,但是由于时区、不用的日历以及不同的字母或符号方法,区域时间就可能不一样。

基础库还支持处理不同的日历体系的 Calendar 日历实例;

在处理跨时区、日历种类和区域的时间转换的时候,都会遇到一些棘手的问题。SwiftDate能够帮你更高效的解决这些问题。

DateInRegion 和 Region

SwiftDate 为了提供完整的时间和日期管理的功能,引入了两个重要的新玩意以及数个扩展。

第一个是一个结构体(struct),称为Region:region,正如其名称,它是对一个地理位置在时间体系中的描述,其中包含三个不同的特征:

这或许是不太重要的标注说明:

GMT(Greenwich Mean Time):指格林威治标准时间;

PST(Pacific Standard Time):指太平洋标准时间;

另一个是DateInRegion,是在特定的国家地区 Region 下,描述一个自身与具体时区和日历无关的时间Date。这是由于特定的国家地区一般采用固定的时区、日历系统与表述规范,只要声明了国家地区,就包含了以上三个要素。实际应用中,使用DateInRegion可以方便的操作上下文中的日期。

SwiftDate 为您提供相同的函数和属性,以管理带有地区属性的DateInRegion时间实例 和 单纯Date时间实例。

默认Region

当你使用普通的Date对象,你可以在Date.defaultRegion中定义的DateInRegion,这个地区包含了:

您可以调用 Date.setDefaultRegion(:) 以改变时间的默认地区 Date.defaultRegion

这个或许不太重要但还是要记住:时间的这些需要在应用启动时设置好(例如,在UIApplication的delegate中函数applicationDidFinishLaunching()中设置就行了)。


时间的组件

概况

使用 SwiftDate,您可以非常方便的操控时间的组件。无论是否设置地区属性,DateInRegionDate都实现了同一套属性和方法来进行时间日期的管理。

请注意:使用简单时间 Date实例时,实际上是基于了设备默认的地区来初始化了 .defaultRegionRegion.GMT()是由设备默认的localeCalendar和当前设备所在地的时区所决定,.defaultRegion 的初始值就是Region.GMT()

如果想要修改的默认的区域,调用Date的静态方法 .setDefaultRegion() 即可!

补充说明:

时间的这些属性值需考虑上下文的地区与日历系统;如果调用者是DateInRegion,SwiftDate 将会使用已经指定的.region来计算具体属性值,如果调用者是普通Date,SwiftDate 将会基于默认的Date.defaultRegion来计算属性值。以下所有属性与组件都服从此原则。

era

返回公元状态,我们日常生活中的 2016 年都以公元年为起点,这些时间的 era 都为 1 , 而公元前的年份如 -2000 年,这些时间的 era 都是 0。所以在操作近代时间时,无需考虑此属性。
声明:

public var era: Int

year

返回年份的数值
声明:

public var year: Int

month

返回月份的数值,如 5
声明:

public var month: Int

day

返回年月日中 的数值,如 30
声明:

public var day: Int

hour

返回时分秒中 的数值
声明:

public var hour: Int

nearestHour

根据四舍五入的方法取出时间的最近小时。简单举例:比如 8:15 会返回 8 ,而 8:50 会返回 9
声明:

public var nearestHour: Int

minute

返回时分秒中 的数值
声明:

public var minute: Int

second

返回时分秒中 的数值
声明:

public var second: Int

nanosecond

返回时间的 毫秒的数值
声明:

public var nanosecond: Int

注意
公历日历定义一个星期有7天,一年有356天,或闰年366天。 然而,356或366都不平均地分成7天的周,因此通常情况下,一年的最后一周在下一年的一天结束,一年的第一周从前一年开始。 为了协调这一点,ISO 8601定义了一个周编号年份,包括52或53整周(364或371天),以便一年的第一周被指定为包含一年中第一个星期四的星期。

您可以将yearForWeekOfYear属性与weekOfYear和weekday属性配合使用,以获取与一年中给定星期的特定工作日对应的日期。 例如,2005年第53周(ISO 2005-W53-6)的第6天对应于公历日历上2005年1月1日星期六。比如罗马时间 2015-12-31 15:10:12 他的 yearForWeekOfYear2016weekOfYear1weekday3

yearForWeekOfYear

ISO8601 的周数计算规则下,日期所属的年份。可能是当前日期的前一年,或者下一年,或者当年。
声明:

public var yearForWeekOfYear: Int

weekOfYear

在 ISO 8601 的周数计算规则下,日期所属的周数。如罗马时间 2015-11-31 是第 49 周,2015-12-31 是第一周。
声明:

public var weekOfYear: Int

weekday

在 ISO 8601 的周数计算规则下,在时间所属的周中, 是星期几,且规定了 1是星期日,也就是每周的起点是周日。如罗马时间 2015-11-31 是星期四 ,其 weekday5

声明:

public var weekday: Int

weekdayOrdinal

以每个月的第一天为当月第一周的起点,无视全年的星期计算规则,比如每个月第 4 天就是第一周,第 8 天就是第二周。

声明:

public var weekdayOrdinal: Int

weekdayName

某个日期的星期名称,如果你设定是中国地区,那周二为“星期二”,日本地区就是 “火曜日” ,美国地区就是 “Tuesday”,注意此值取决于地区属性。

声明:

public var weekdayName: String

monthDays

时间所在月份,该月份的天数,比如公历中, 二月 可能有 29 天或 28 天,12 月有 31天。
声明:

public var monthDays: Int

quarter

返回季度单位的数值。注意在常识中,一年分为春夏秋冬四季,但在不同地区季度的起始时间不同,因此此属性在没有赋值的情况下均为 0 ,当您需要使用前,请赋值。
声明:

public var quarter: Int

weekOfMonth

返回月份所包含的周数,此处按照 IOS 8601 的标准,每个月横跨的周数,比如 2015年2月 的 weekOfMonth 是 4 ,而 2016 年 2 月的 weekOfMonth 是 5 。
声明:

public var weekOfMonth: Int

shortMonthName

该时间所在月份的简称,比如美国地区 2月全称是 February ,简称是 Feb 即 2015-02-01 改时间的 shortMonthName 就是 Feb
声明:

public var monthName: Int

leapMonth

返回一个布尔值,说明某个月份是否是闰月。
true,表示该时间所在月份是闰月,否则不是闰月。
声明:

public var leapMonth: Bool

leapYear

返回一个布尔值,说明某个年份是否是闰年。
true,表示该时间所在的年份是闰年,否则不是闰年。
声明:

public var leapYear: Bool

补充说明:
这个值将会在其使用的日历和时区的环境中解释;如果调用者是DateInRegion,系统环境将会使用相关的.region来定义,如果调用者是普通Date,系统环境将会使用默认值Date.defaultRegion来定义。

julianDay

儒略日 (Julian Day) 是天文学家使用从朱利安时期以来连续的天数。详情请见维基百科词条 儒略日
声明:

public var julianDay: Double

modifiedJulianDay

儒略日 (Julian Day) 有一些列的计算方法,由于用途是天文领域,且与公历换算复杂,此处不展开叙述,详情请见维基百科词条 Julian Day

声明:

public var modifiedJulianDay: Double

previousWeekend

返回该时间所在周的上个周末,这个周末以元组表示,第一个元素是上周末开始的时间,第二个是上周末的结束时间。且这两个时间都是 DateInRegion 实例。
注意:是上个周的周末,不是时间本来所在周的周末

声明:

public var previousWeekend: (startDate: DateInRegion, endDate: DateInRegion)?

thisWeekend

返回该时间所在周的周末,这个周末以元组表示,第一个元素是本周末开始的时间,第二个是本周末的结束时间。且这两个时间都是 DateInRegion 实例。

声明:

public var thisWeekend: (startDate: DateInRegion, endDate: DateInRegion)?

nextWeekend

返回该时间所在周的下个周末,这个周末以元组表示,第一个元素是下周末开始的时间,第二个是下周末的结束时间。且这两个时间都是 DateInRegion 实例。
注意:是下个周的周末,不是时间本来所在周的周末
声明:

public var nextWeekend: (startDate: DateInRegion, endDate: DateInRegion)?

isToday

返回布尔值,返回调用此属性的时间实例是否在今天。
声明:

public var isToday: Bool

isYesterday

返回布尔值,返回调用此属性的时间实例是否在昨天。
声明:

public var isYesterday: Bool

isTomorrow

返回布尔值,返回调用此属性的时间实例是否在明天。
声明:

public var isTomorrow: Bool

isInWeekend

返回布尔值,返回调用此属性的时间实例是否在其所在周的周末时间段内。
声明:

public var isInWeekend: Bool

isInPast

比较该时间实例与当前时间,换算成时间绝对值来,比较大小,如果比当前时间小,即为过去时间,返回 true;反之,返回 false。简言之:早于现在时刻的时间 返回 true
声明:

public var isInPast: Bool

isInFuture

比较该时间实例与当前时间,换算成时间绝对值来,比较大小,如果比当前时间大,即为将来时间,返回 true;反之,返回 false。简言之:晚于现在时刻的时间 返回 true

声明:

public var isInFuture: Bool

isInSameDayOf()

比较时间实例与给定的时间是否为在同一天。比较时采用调用者的时区和日历设置。
声明:

public func isInSameDayOf(date: DateInRegion) -> Bool
public func isInSameDayOf(date: Date) -> Bool

startOfDay

返回当前时间所在 的起始时刻,比如 2016-11-11 23:10:00 的 startOfDay 是 2016-11-11 00:00:00 。注意会结合时区和日历。
声明:

public var startOfDay: DateInRegion
public var startOfDay: Date

endOfDay

返回当前时间所在 的结束时刻,比如 2016-11-11 23:10:00 的 startOfDay 是 2016-11-11 23:59:59 。注意会结合时区和日历。
声明:

public var endOfDay: DateInRegion
public var endOfDay: Date

nextMonth

时间所在月份的下一个月的同一日的起始时间,比如 2016-03-31 13:30:00 的 nextMonth 是 2016-04-30 00:00:00,注意 SwiftDate 会自动换算不同月份天数不同的问题。
声明:

public var nextMonth: DateInRegion
public var nextMonth: Date

prevMonth

时间所在月份的上一个月的同一日的起始时间,比如 2016-03-31 13:30:00 的 nextMonth 是 2016-02-29 00:00:00,注意 SwiftDate 会自动换算不同月份天数不同的问题。
声明:

public var prevMonth: DateInRegion 
public var prevMonth: Date

startOf()

给定一个单位,返回时间在此单位的起始值,比如给定以年为单位, 2016-11-11 11:11:11 的 startOf() 是 2016-01-01 00:00:00 ;给定 时 为单位,会反回 2016-11-11 11:00:00
声明:

public func startOf(component: Calendar.Component) -> DateInRegion
public func startOf(component: Calendar.Component) -> Date

解析与创建时间

概览


一个关联到具体地区的时间可以由多种方法创建;这种时间可以由一对 DateRegion 组成,或者从自定义时间格式的字符串解析(SwiftDate 支持自定义的时间格式,诸如 ISO8601 标准格式RSS 或AltRSS.NET 时间),再或者可以通过解析 Calendar.Component对象的集合来创建。
当然你也可以通过数学运算从另两个时间来新建时间。
本章节罗列了所有关于创建时间的方法,无论是否包含地域信息,DateInRegionDate 都适用于这些方法。

根据字符串解析时间


众所周知,解析字时间符串并转换成时间实例很繁琐。SwiftDate 支持众多时间格式,以帮你提高效率,减少开销。
format 参数赋值,以声明你使用的时间格式:可以是自定义时间格式或 ISO8601 datetime、.NET datetime 等标准化时间格式。

声明
func init(string: String, format: DateFormat, fromRegion region: Region? = nil) throws

参数

返回结果
返回结果是 包含地区信息的 DateInRegion 时间实例。
例子

let rome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italian)

// 基于自定义时间格式解析时间字符串
let date1 = try! DateInRegion(string: "1999-12-31 23:30:00", format: .custom("yyyy-MM-dd HH:mm:ss"), fromRegion: regionRome)

// 基于 AltRss 标准来解析时间字符串
let date2 = try! "3 feb 2001 15:30:00 +0100".date(format: .rss(alt: true), fromRegion: regionRome)
// 同上
let date3 = try! DateInRegion(string: "3 feb 2001 15:30:00 +0100", format: .ss(alt: true)), fromRegion: regionRome)

//  解析 ISO8601 标准互联网时间字符串
let date4 = DateInRegion(string: "2001-02-03T15:30:00+01:00", format: .iso8601(options: .withInternetDateTime), fromRegion: regionRome)

// 解析自定义时间格式字符串
let date5 = try! DateInRegion(string: "sab 3 feb 2001, 30 minutes after 15 (timezone is +0100)", format: .custom("eee d MMM YYYY, m 'minutes after' HH '(timezone is' Z')'"), fromRegion: regionRome)

获取当前时刻的时间实例


使用默认的 init() 方法可快捷的创建基于设备当前地区和时刻的 DateInRegion 时间实例。

声明
func init()

返回结果
返回的 DateInRegion 对象定义了当前时刻(Date())和设备当前的所在地区,此地区属性(Region.Local())包含了时区 .timeZone、区域时间格式 .locale、当地日历种类 .calendar (所有相关设置都会自动更新)

补充说明:地区 包含了3个属性:时区(如 GMT +8)、当地时间格式(如中国以 年-月-日,美国以 月-日-年)、日历种类(如公历、日本日历、佛教日历)

例子

// Create a new DateInRegion which represent the current moment (Date()) in current device's local settings
let now = DateInRegion()

根据给定的时刻和地区来创建时间实例


给定时间和其所在地区,你可以创建对应的 DateInRegion 对象。创建后,使用 DateInRegion 对象进行的所有操作,都将应用对应地区的要求;DateInRegion对应的属性和方法会自动套用区域的设置;
声明
func init(absoluteDate date: Date, in region: Region)
参数

返回结果
返回对象是一个解析自给定地区的 DateInRegion 时间实例。

例子

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// Resulting object is DateInRegion which express the current moment in Rome
let dateInRome = DateInRegion(absoluteDate: Date(), in: regionRome)

根据日期要素创建时间


将日历的因素集合以 DateComponents 对象封装后创建 DateInRegion 时间是另一种好方法。DateComponents 实例化对象的TimeZone Locale Calendar 属性都必须声明以保证获得的时间有效;如果缺失任何一个,将会抛出 .MissingCalTzOrLoc 异常。

声明
func init(components: DateComponents)

参数

返回结果
返回一个 DateInRegion 时间实例,其日期由传入的 DateComponets 来决定;

例子

var cmp = DateComponents()
cmp.timeZone = TimeZoneName.europeOslo.timeZone
cmp.calendar = CalendarName.gregorian.calendar
cmp.calendar?.locale = LocaleName.englishNorway.locale
cmp.year = 2005
cmp.month = 4
cmp.day = 15
cmp.hour = 20
cmp.minute = 30

// create a new DateInRegion on 15 Apr 2005, 20:30:00 GMT+2
let date = try! DateInRegion(components: cmp)

根据时间组件创建时间


传入一组 Calendar.Component 与对应值组成的数组(由[Calendar.Component:Int] 样式的字典和具体的地区所定义)来创建一个新的 DateInRegion 时间实例
声明
func init(components: [Calendar.Component:Int], in region: Region)

参数

返回结果
返回一个 DateInRegion 时间实例,其组件由传入的 DateComponets 来决定;

例子

let c: [Calendar.Component : Int] = [.year: 2002, .month: 3, .hour: 5, .day: 4, .minute: 6, .second: 7, .nanosecond: 87654321]
// create a new DateInRegion on 2002-03-04 at 05:06:07.87654321 (+/-10) in Region.Local()
let date = try! DateInRegion(components: c, fromRegion: nil)

修改时间

SwiftDare 中文版说明文档 - 修改时间 - 5

@(丁香园学习笔记)[swift, 翻译]

概览


使用 SwiftDate 来对时间进行相关修改操作十分简便;修改时间组件,比较两个时间(时间的不同以他们之间的不等组件来表示)。无论是带有地区属性的 DateInRegion 时间实例还是单一结构的 Date 时间实例,都可以进行这些操作。

数学运算


为时间添加组件
你可以使用 Swift 中常用数学运算符,来增减时间元素的值。如+-

根据你所表达的上下文,SwiftDate 会自动判断并生成带有地区属性的 DateInRegion 时间实例或单一结构的 Date 时间实例。
可用的时间组件有: nanoseconds,seconds,minutes,hours,days,weeks,years
下面是一些数学运算的例子:

// 创建一个罗马时间 2015-01-03 @ 15:10:00
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
var date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

// 让我试试数学运算符修改时间元素值
date = date + 3.seconds + 15.minutes // -> 03 gen 2015, 15:25:03 CET
date = date - 120.seconds // minus 2 minutes -> 03 gen 2015, 15:23:03 CET
date = date + 3.weeks // 24 gen 2015, 15:23:03 CET
// 你也可以直接增加绝对秒数,SwiftDate 会自动帮你换算
date.add(interval: 10) // 24 gen 2015, 15:23:03 CET

比较时间


概述
在 Swift3 的 Foundation 库中,已经支持比较 Date 时间实例。
SwiftDate 为带有地区属性的 DateInRegion 补充了相似的比较方法,并通过添加新方法扩充了现有 Foundation 库对不同粒度下的时间比较。

比较简单时间
你可以使用 >,>=,<,=< 运算符来比较时间,例如:

// 03 gen 2015, 15:10:00 CET
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let date2 = try! DateInRegion(components: [.year: 2015, .month: 2, .day: 5, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
        
if date2 > date1 { // DateInRegion supports Equatable protocol you can use >=, <=, < or >
    print("'\(date2)' date is later than '\(date1)'")
}

if date2 == date1 {
  // simple equality
}

时间所对应的单位起始值


概述
利用 .startOf() 方法,传入计算单位后,你可以获得改时间到现在的差值。补充说明:时间是一个点值,而时间的单位都是一段时间的差值,这里的起始值指的就是时间点值在时间单位的区间中的左边界值;比如,2016-11-11 20:39:50 ,以月为单位,起始值是 2016-11-01 00:00:00;以小时为单位 ,起始值是 2016-11-11 20:00:00。
声明
startOf(component: Calendar.Component) -> DateInRegion
startOf(component: Calendar.Component) -> Date

参数

返回值
返回给定时间单位区间的起始值所对应的 DateInRegion/Date 时间实例。

例子

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let startOfHour = date.startOf(component: .hour) // 03 gen 2015, 15:00:00 CET
let startOfMonth = date.startOf(component: .month) // 01 gen 2015, 00:00:00 CET
let startOfWeek = date.startOf(component: .weekOfMonth) // 28 dic 2014, 00:00:00 CET

时间所对应的单位结束值

概述
利用 .startOf() 方法,传入单位后,你可以获得现有时间对应的结束址。

声明
endOf(component: Calendar.Component) -> DateInRegion
endOf(component: Calendar.Component) -> Date

参数

返回结果
返回给定时间单位区间的结束址所对应的 DateInRegion/Date 时间实例。

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let startOfHour = date.endOf(component: .hour) // 03 gen 2015, 15:59:59 CET
let startOfMonth = date.endOf(component: .month) // 31 gen 2015, 23:59:59 CET
let startOfWeek = date.endOf(component: .weekOfMonth) // 03 gen 2015, 23:59:59 CET

对时间的时刻进行修改

概述
针对现有的时间实例, .atTime(hour:minute:second) 方法可以修改时刻,提供 的值,获得一个新的时间,新的实例中日期与日期不变。
异常
如果原时间不能生成新时间,会抛出 .FailedToCalculate 异常。

声明
func atTime(hour: Int, minute: Int, second: Int) throws -> DateInRegion
func atTime(hour: Int, minute: Int, second: Int) throws -> Date

参数

返回结果
在原时间基础上,依据你提供的生成一个新时间实例,地区设置保持不变。此外,其他的时间组件在必要时 SwiftDate 会加以修改,以保持合理性。

例子

// 生成一个新的罗马时间,日历格式选择公历,时间表述格式以意大利为准。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

// 应用 `.atTime()` 方法
let newDateAtGivenTime = try! date.atTime(hour: 09, minute: 10, second: 22) // 03 gen 2015, 09:10:22 CET

对时间的指定组件进行修改

概述
对指定的时间组件的值进行修改,在保证其他组件值合理的情况下,返回一个新的时间实例。

声明
func at(unit: Calendar.Component, value: Int) throws -> DateInRegion
func at(unit: Calendar.Component, value: Int) throws -> Date

参数

异常
如果给定的组件赋值不成功,不能生成新时间实例时,会抛出 .FailedToCalculate 异常。

返回结果
在原时间基础上,修改给定组件的值,然后生成新的时间实例并返回。SwiftDate 在合理的前提下不会改变与给定组件相比单位更大组件的值。补充说明:如果修改了时间中 的值,那所有的等更小的组件的值都会被赋最小值 ,而 等更大单位的组件的值会保持原样,这样做是为了保持合理性,03-31,如果对月改成 2 ,那2-31 很明显不合理。比如 2016-11-11 11:11:11 修改了 12 那,返回的新的时间是 2016-12-01 00:00:00

例子

// 生成一个新的罗马时间,日历格式选择公历,时间表述格式以意大利为准。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let atGivenYear = try! date.at(unit: .year, value: 2020) // 01 gen 2020, 00:00:00 CET. day is altered

批量修改时间组件的值


概述
给定一个 [时间组件 : 值] 的字典,SwiftDate 会根据时间组件的单位由小到大排序,并修改对应组件的值。
在 SwiftDate 中,规定时间组件的由小到大排序为:
.nanosecond,.second,.minute,.hour,.day,.month,.year,.yearForWeekOfYear,.weekOfYear,.weekday,.quarter,.weekdayOrdinal,.weekOfMonth.

声明
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> DateInRegion
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> Date

参数

异常
对某些时间组件赋值发生错误时,会抛出 .FailedToCalculate 异常。

返回结果
对指定组件赋值后,生成一个新的时间实例,比给定时间组件更大的组件将不会被修改,更小的如果没有赋值将全部赋最小值;这部分的原理,在上一个方法中有补充说明。

例子

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let time = try! date.at(unitsWithValues: [.year: 2016, .month: 7]) // 01 gen 2016, 00:00:00 CET

获取多个时间中的最靠前(时间线上最靠右的)的时间

概述
在给定的多个时间实例集合中,返回其中最新的时间实例。比较依据绝对时间值,时间实例的地区,时区,表述格式等组件不会对比较结果产生影响。

声明
(DateInRegion) static func latestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func latestDate(_ list: [DateInRegion]) -> Date

例子

// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)

// get the latest date in a set
let latestDate = DateInRegion.latestDate([date1,date2,date3]) // is date1 (2015-01-03 14:20:00 +0000)
// or directly via Array extension
let latestDate = [date1,date2,date3].latestDate

获取多个时间中最久远(时间线上最靠左的)的时间

概述
在给定的多个时间实例集合中,返回其中最久远的时间。比较依据绝对时间值,时间实例的地区,时区,表述格式等组件不会对比较结果产生影响。

声明
(DateInRegion) static func earliestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func earliestDate(_ list: [DateInRegion]) -> Date

例子

// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
        
// get the latest date in a set
let earliestDate = DateInRegion.earliestDate([date1,date2,date3]) // is date2 30 dic 2014, 20:10:00 CET
// or directly via Array extension
let earliestDate = [date1,date2,date3].earliestDate

给定单位,比较两时间实例

概述
在给定单位的前提下,比较现有时间是否晚于提供的时间。

声明
func compare(to date: DateInRegion, granularity: Calendar.Component) -> ComparisonResult
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult

参数

是否早于某时间(给定单位)

概述
在给定单位前提下,比较现有时间是否早于给定时间。

声明
func isBefore(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func isBefore(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool

参数

是否晚于某时间(给定单位)

概述
在给定单位粒度前提下,比较现有时间是否晚于给定时间。

声明
func isAfter(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
func isAfter(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool

参数

是否等于某时间

概述
比较现有时间实例是否完全等于给定时间。

声明
func isEqual(to compareDate: DateInRegion) -> Bool

参数


修改时间

SwiftDare 中文版说明文档 - 修改时间 - 5

@(丁香园学习笔记)[swift, 翻译]

概览


使用 SwiftDate 来对时间进行相关修改操作十分简便;修改时间组件,比较两个时间(时间的不同以他们之间的不等组件来表示)。无论是带有地区属性的 DateInRegion 时间实例还是单一结构的 Date 时间实例,都可以进行这些操作。

数学运算


为时间添加组件
你可以使用 Swift 中常用数学运算符,来增减时间元素的值。如+-

根据你所表达的上下文,SwiftDate 会自动判断并生成带有地区属性的 DateInRegion 时间实例或单一结构的 Date 时间实例。
可用的时间组件有: nanoseconds,seconds,minutes,hours,days,weeks,years
下面是一些数学运算的例子:

// 创建一个罗马时间 2015-01-03 @ 15:10:00
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
var date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

// 让我试试数学运算符修改时间元素值
date = date + 3.seconds + 15.minutes // -> 03 gen 2015, 15:25:03 CET
date = date - 120.seconds // minus 2 minutes -> 03 gen 2015, 15:23:03 CET
date = date + 3.weeks // 24 gen 2015, 15:23:03 CET
// 你也可以直接增加绝对秒数,SwiftDate 会自动帮你换算
date.add(interval: 10) // 24 gen 2015, 15:23:03 CET

比较时间


概述
在 Swift3 的 Foundation 库中,已经支持比较 Date 时间实例。
SwiftDate 为带有地区属性的 DateInRegion 补充了相似的比较方法,并通过添加新方法扩充了现有 Foundation 库对不同粒度下的时间比较。

比较简单时间
你可以使用 >,>=,<,=< 运算符来比较时间,例如:

// 03 gen 2015, 15:10:00 CET
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let date2 = try! DateInRegion(components: [.year: 2015, .month: 2, .day: 5, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
        
if date2 > date1 { // DateInRegion supports Equatable protocol you can use >=, <=, < or >
    print("'\(date2)' date is later than '\(date1)'")
}

if date2 == date1 {
  // simple equality
}

时间所对应的单位起始值


概述
利用 .startOf() 方法,传入计算单位后,你可以获得改时间到现在的差值。补充说明:时间是一个点值,而时间的单位都是一段时间的差值,这里的起始值指的就是时间点值在时间单位的区间中的左边界值;比如,2016-11-11 20:39:50 ,以月为单位,起始值是 2016-11-01 00:00:00;以小时为单位 ,起始值是 2016-11-11 20:00:00。
声明
startOf(component: Calendar.Component) -> DateInRegion
startOf(component: Calendar.Component) -> Date

参数

返回值
返回给定时间单位区间的起始值所对应的 DateInRegion/Date 时间实例。

例子

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let startOfHour = date.startOf(component: .hour) // 03 gen 2015, 15:00:00 CET
let startOfMonth = date.startOf(component: .month) // 01 gen 2015, 00:00:00 CET
let startOfWeek = date.startOf(component: .weekOfMonth) // 28 dic 2014, 00:00:00 CET

时间所对应的单位结束值

概述
利用 .startOf() 方法,传入单位后,你可以获得现有时间对应的结束址。

声明
endOf(component: Calendar.Component) -> DateInRegion
endOf(component: Calendar.Component) -> Date

参数

返回结果
返回给定时间单位区间的结束址所对应的 DateInRegion/Date 时间实例。

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let startOfHour = date.endOf(component: .hour) // 03 gen 2015, 15:59:59 CET
let startOfMonth = date.endOf(component: .month) // 31 gen 2015, 23:59:59 CET
let startOfWeek = date.endOf(component: .weekOfMonth) // 03 gen 2015, 23:59:59 CET

对时间的时刻进行修改

概述
针对现有的时间实例, .atTime(hour:minute:second) 方法可以修改时刻,提供 的值,获得一个新的时间,新的实例中日期与日期不变。
异常
如果原时间不能生成新时间,会抛出 .FailedToCalculate 异常。

声明
func atTime(hour: Int, minute: Int, second: Int) throws -> DateInRegion
func atTime(hour: Int, minute: Int, second: Int) throws -> Date

参数

返回结果
在原时间基础上,依据你提供的生成一个新时间实例,地区设置保持不变。此外,其他的时间组件在必要时 SwiftDate 会加以修改,以保持合理性。

例子

// 生成一个新的罗马时间,日历格式选择公历,时间表述格式以意大利为准。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

// 应用 `.atTime()` 方法
let newDateAtGivenTime = try! date.atTime(hour: 09, minute: 10, second: 22) // 03 gen 2015, 09:10:22 CET

对时间的指定组件进行修改

概述
对指定的时间组件的值进行修改,在保证其他组件值合理的情况下,返回一个新的时间实例。

声明
func at(unit: Calendar.Component, value: Int) throws -> DateInRegion
func at(unit: Calendar.Component, value: Int) throws -> Date

参数

异常
如果给定的组件赋值不成功,不能生成新时间实例时,会抛出 .FailedToCalculate 异常。

返回结果
在原时间基础上,修改给定组件的值,然后生成新的时间实例并返回。SwiftDate 在合理的前提下不会改变与给定组件相比单位更大组件的值。补充说明:如果修改了时间中 的值,那所有的等更小的组件的值都会被赋最小值 ,而 等更大单位的组件的值会保持原样,这样做是为了保持合理性,03-31,如果对月改成 2 ,那2-31 很明显不合理。比如 2016-11-11 11:11:11 修改了 12 那,返回的新的时间是 2016-12-01 00:00:00

例子

// 生成一个新的罗马时间,日历格式选择公历,时间表述格式以意大利为准。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)

let atGivenYear = try! date.at(unit: .year, value: 2020) // 01 gen 2020, 00:00:00 CET. day is altered

批量修改时间组件的值


概述
给定一个 [时间组件 : 值] 的字典,SwiftDate 会根据时间组件的单位由小到大排序,并修改对应组件的值。
在 SwiftDate 中,规定时间组件的由小到大排序为:
.nanosecond,.second,.minute,.hour,.day,.month,.year,.yearForWeekOfYear,.weekOfYear,.weekday,.quarter,.weekdayOrdinal,.weekOfMonth.

声明
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> DateInRegion
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> Date

参数

异常
对某些时间组件赋值发生错误时,会抛出 .FailedToCalculate 异常。

返回结果
对指定组件赋值后,生成一个新的时间实例,比给定时间组件更大的组件将不会被修改,更小的如果没有赋值将全部赋最小值;这部分的原理,在上一个方法中有补充说明。

例子

// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
    
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let time = try! date.at(unitsWithValues: [.year: 2016, .month: 7]) // 01 gen 2016, 00:00:00 CET

获取多个时间中的最靠前(时间线上最靠右的)的时间

概述
在给定的多个时间实例集合中,返回其中最新的时间实例。比较依据绝对时间值,时间实例的地区,时区,表述格式等组件不会对比较结果产生影响。

声明
(DateInRegion) static func latestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func latestDate(_ list: [DateInRegion]) -> Date

例子

// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)

// get the latest date in a set
let latestDate = DateInRegion.latestDate([date1,date2,date3]) // is date1 (2015-01-03 14:20:00 +0000)
// or directly via Array extension
let latestDate = [date1,date2,date3].latestDate

获取多个时间中最久远(时间线上最靠左的)的时间

概述
在给定的多个时间实例集合中,返回其中最久远的时间。比较依据绝对时间值,时间实例的地区,时区,表述格式等组件不会对比较结果产生影响。

声明
(DateInRegion) static func earliestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func earliestDate(_ list: [DateInRegion]) -> Date

例子

// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
        
// get the latest date in a set
let earliestDate = DateInRegion.earliestDate([date1,date2,date3]) // is date2 30 dic 2014, 20:10:00 CET
// or directly via Array extension
let earliestDate = [date1,date2,date3].earliestDate

给定单位,比较两时间实例

概述
在给定单位的前提下,比较现有时间是否晚于提供的时间。

声明
func compare(to date: DateInRegion, granularity: Calendar.Component) -> ComparisonResult
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult

参数

是否早于某时间(给定单位)

概述
在给定单位前提下,比较现有时间是否早于给定时间。

声明
func isBefore(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func isBefore(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool

参数

是否晚于某时间(给定单位)

概述
在给定单位粒度前提下,比较现有时间是否晚于给定时间。

声明
func isAfter(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
func isAfter(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool

参数

是否等于某时间

概述
比较现有时间实例是否完全等于给定时间。

声明
func isEqual(to compareDate: DateInRegion) -> Bool

参数


时间的格式化

概览
SwiftDate 提供多个简便的方法来输出或解析时间和时间间隔字符串,以下为常见时间格式举例:
使用 tr35-31
格式的时间格式字符串,例如 yyyy-MM-dd
对应 2015-01-05

任意符合 ISO8601
及其子规范的时间格式字符串

符合 .NET
的时间格式字符串

扩展化日期/时间格式,详情请参照 EDTF

声明单位的时间差,如 (date2 - date1).in(.hours)

人类可读或口语化的字符串,如 "1 hour ago", "1m", "now"

两个时间之间的差值,比如 "2h,5m,3s"

获取自定义格式的时间字符串

你可以使用 .string()
方法传入自定义格式,获得时间实例生成对应的字符串。字符串的 Unicode 规范与 Cocoa 用法一致。
声明 DateFormat
包含了 .custom
自定义格式,你可以使用通用的// with DateFormat set to .custom([format string])
func string(format: DateFormat) -> String

也可以直接使用接受自定义格式的方法// shortcut to pass directly the format of the string
func string(custom: String) -> String

参数
format
: a DateFormat
struct. To use custom strings pass .custom()
and pass the value of the formatter

例子

let date = DateInRegion()

let str = date.string(format: .custom("yyyy-MM-dd HH:mm:ss")) // example output: 2016-09-28 13:48:17
// you can also use the shortcut:
let str = date.string(custom: "yyyy-MM-dd HH:mm:ss") // same result



获取 ISO8601 格式的时间字符串
SwiftDate 支持 ISO8601
时间规范的所有要求。你可以基于其子规范而自定义格式。
声明// with DateFormat set to .custom() func string(format: DateFormat) -> String

参数
format
: a DateFormat
struct. To use custom strings pass .custom() and pass the value of the formatter

例子

let date = DateInRegion()

// Here some combinations of ISO8601DateTimeFormatter.Options you can set to format (or parse) an ISO8601 datetime
let iso8601_ex_1 = date.string(format: .iso8601(options: [.withInternetDateTime])) // 2016-09-29T10:47:39+02:00
let iso8601_ex_2 = date.string(format: .iso8601(options: [.withFullDate])) // 2016-09-29
let iso8601_ex_3 = date.string(format: .iso8601(options: [.withWeekOfYear,.withYear])) // 2016W40
let iso8601_ex_4 = date.string(format: .iso8601(options: [.withFullTime,.withFullDate,.withSpaceBetweenDateAndTime])) // 2016-09-29 10:49:42+02:00
let iso8601_ex_5 = date.string(format: .iso8601(options: [.withMonth,.withYear,.withTime])) // 20160910:50:36



获取 AltRss 格式的时间字符串
SwiftDate 也提供对 RSS
和AltRSS
时间格式的支持。(包括解析与生成字符串)
声明func string(format: DateFormat) -> String // with DateFormat set to .rss(alt: Bool)

参数
format
: a DateFormat
struct. To get RSS/AltRSS
pass.rss(alt: Bool)
and pass true
or false
to set the alt format.

例子

let date = DateInRegion()

let altrss_string = date.string(format: .rss(alt: true)) // Alt RSS Format: 29 Sep 2016 10:55:34 +0200
let rss_string = date.string(format: .rss(alt: false)) // RSS Format: Thu, 29 Sep 2016 10:55:34 +0200



获取 .NET 格式的时间字符串
SwiftDate 也提供对 .NET
时间格式的支持。(包括解析与生成字符串)
声明func string(format: DateFormat) -> String // with DateFormat set to .dotNET

参数
format
: a DateFormat
struct. To get .NET
pass.dotNET
and pass true
or false
to set the alt format.

例子

let date = DateInRegion()

let donet_string = date.string(format: .dotNET) // /Date(1475139751633+0200)/



获取扩展化(EDTF)格式的时间字符串
SwiftDate 也提供对扩展化日期/时间格式的支持。
声明func string(format: DateFormat) -> String // with DateFormat set to .extended

参数
format
: a DateFormat
struct. To get extended datetime formatted string pass .extended
and pass true
or false
to set the alt format.

例子

let date = DateInRegion()

let str = date.string(format: .extended) // Thu 29-Sep-2016 AD 11:31:23.886 GMT+2



获取时间间隔的字符串表述
借助 SwiftDate ,你可以很方便的将时间间隔或两个时间之间的差值,以一个或多个单位输出成字符串。如果你想要获取的低级单位的值可以被完整进位,那低级单位所对应的值就被赋值为 0。比如 120秒 如果转换成 分
、秒
的组合,会被转换成 2分 0秒
; 125秒 则会得到 2分 5秒

声明多个时间单位时public func in(_ components: [Calendar.Component], of calendar: CalendarName? = nil) -> [Calendar.Component : Int]
单个时间单位时public func in(_ component: Calendar.Component, of calendar: CalendarName? = nil) -> Int?

参数
component
or components
: specify the component or an array of compone .extended
and pass true
or false
to set the alt format.

例子

let dateA = DateInRegion()

let dateB = dateA + 20.minutes + 120.seconds // create another date with some diff
// Get difference in minutes
let diff_in_minutes = (dateB - dateA).in(.minute) // 22 minutes
// Get difference in seconds and minutes
let diff_in_min_and_secs = (dateB - dateA).in([.minute,.second]) // lower components are grouped. You will get .second=0, .minute=2
// This is another example
let another_diff: TimeInterval = 125 // 125 seconds
let diff_in_min_and_secs_2 = another_diff.in([.minute,.second]) // you will get .minute=2 and .second=5



获取 iOS 样式的时间字符串
你可以使用 Foundation
中的时间格式来输出时间字符串。
声明func string(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String

参数
dateStyle
: the style used to print a date as DateFormatter.Style
. If not specified.medium
is used.

timeStyle
: the style used to print a time as DateFormatter.Style
. If not specified .medium
is used.

例子

let date = DateInRegion() // create a date from current time in local device's region and calendar

// Some examples of date as string formatted with different styles for date and time
let example_1 = date.string(dateStyle: .medium, timeStyle: .long) // Sep 29, 2015, 1:01:13 PM GMT+2
let example_2 = date.string(dateStyle: .short, timeStyle: .short) // 9/29/15, 1:00 PM
let example_3 = date.string(dateStyle: .long, timeStyle: .none) // September 29, 2015



获取人类可读或白话式时间字符串
你可以使用 Foundation
来自定义日期 - 时间格式来输出时间字符串;同样的,时间间隔也可以使用口语化字符串来表述。
声明获取一个时间与现在时刻的差值时func colloquialSinceNow() throws -> (date: String, time: String?)
获取两个时间之间的差值时func colloquial(toDate date: DateInRegion) throws -> (date: String, time: String?)
注意:该方法返回的是一个日期与时间的元组。
异常如果两个时间采用不同的日历,会抛出 .DifferentCalendar
异常;如果无法计算出两个时间的间隔,会抛出 .FailedToCalculate
异常。
参数
date
: reference date for comparisor

例子

// Returned tuples (in EN):

// "past month" for interval, "Aug, 29 2016" for relevant time
let dateA = DateInRegion() - 1.months
let (colloquial,relevantTime) = try! dateA.colloquialSinceNow()

// Returned tuples (in EN):
// "2 hours ago" for interval, "at 11:28" for relevant time
let dateB = DateInRegion() - 2.hours - 14.minutes
let (colloquial,relevantTime) = try! dateB.colloquialSinceNow()

// Returned tuples (in EN):
// // "14 minutes ago" for interval, nil for relevant time
let dateC = DateInRegion() - 14.minutes
let (colloquial,relevantTime) = try! dateC.colloquialSinceNow()

// Returned tuples (in EN):
// "2012" for interval, "Sep 2012" for relevant time
let dateD = DateInRegion() - 4.years
let (colloquial,relevantTime) = try! dateD.colloquialSinceNow()



指定单位下,获取两个时间之间的间隔字符串
SwiftDate 可以在指定组件单位的前提下,获取两个时间的差值,并输出为字符串;你可以设置任意一个组件的显示位置,比如(年使用 y
或years
来表述);组件所对应的最大值以及最小值都会被妥善处理,比如日月年这些单位最小值是 1,最大值是 12,而时分秒的最大值是 60 ,最小值是 0。
声明 获取一个时间与现在时刻的差值时func timeComponentsSinceNow(options:,shared:) throws -> String
获取两个时间之间的差值时func timeComponents(to:options:shared:) throws -> String

异常如果不能计算出有效的时间间隔,将会抛出 .FailedToCalculate
错误。
参数
to
: reference date for comparisor

options
: struct ComponentsFormatterOptions which defines a list of options used to print time components

例子

let region = Region.GMT()

let dateB = DateInRegion(absoluteDate: Date(), in: region)
let dateC = dateB - 2.years - 4.months - 5.days

let str2 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(style: .positional)) // -2y 4m 0w 5d 0:00:00

let str3 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(style: .full)) // -2 years, 4 months, 0 weeks, 5 days, 0 hours, 0 minutes, 0 seconds

let str4 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(zero: .dropAll)) // -2y 4m 5d
let dateD = dateB + 1.months
let str5 = try! dateD.timeComponentsSinceNow(options: ComponentsFormatterOptions(allowedUnits: [.weekOfMonth,.day], zero: .dropAll)) // 4w 2d

上一篇下一篇

猜你喜欢

热点阅读