我试图将当前日期与 NSDate()
之间的差异与来自PHP time();
调用的日期区分开来,例如: NSDate(timeIntervalSinceReferenceDate: 1417147270)
. 如何获得两个日期之间的时间差异 . 我想要一个比较两个日期的函数和 if(seconds > 60)
然后它返回分钟, if(minutes > 60)
返回小时和 if(hours > 24)
返回天等等 .
我该怎么办呢?
编辑:当前接受的答案完全符合我的想法 . 我推荐它用于在PHP time()
函数使用的表单中获取两个日期之间的时间 . 如果你不是1970年1月1日以秒为单位的时间 . 这对于PHP中的后端是有益的 . 如果你在下面找到're using a backend like NodeJS you might want to consider some of the other options you' .
16 回答
Xcode 8.3 • Swift 3.1 or later
您可以使用日历来帮助您创建扩展以执行日期计算,如下所示:
使用日期组件格式化程序
如果有人需要显示所有时间单位,例如“小时分钟秒”而不仅仅是“小时” . 假设两个日期之间的时差是1小时59分20秒 . 此功能将显示“1h 59m 20s” .
这是我的代码:
在Swift 3中:
你问:
我'm assuming that you'试图 Build 两个日期之间经过时间的字符串表示 . Apple没有编写自己的代码来实现这一目标,而是已经设计了一个专门用于实现这一目标的类 . 也就是说,使用DateComponentsFormatter,将allowedUnits设置为对您的应用有意义的任何值,将unitsStyle设置为您想要的任何值(例如
.full
),然后调用string(from:to:) .例如 . 在Swift 3中:
这也将本地化适用于相关设备的字符串 .
或者,在Swift 2.3中:
如果您正在寻找实际数值,只需使用
dateComponents
. 例如 . 在Swift 3中:或者,在Swift 2.3中:
从@ leo-dabus的答案中结合使用Extension DateComponentsFormatter
Xcode 8.3 • Swift 3.1
我为Leo Dabus的asnwer添加了一个“长”版本,以防你想要一个字符串说“2周前”,而不仅仅是“2w”......
Swift 3.0 略有修改的代码
使用Swift 3,根据您的需要,您可以选择以下两种方法之一来解决您的问题 .
1.显示用户的两个日期之间的差异
您可以使用DateComponentsFormatter为应用程序界面创建字符串 .
DateComponentsFormatter
具有maximumUnitCount
属性,并具有以下声明:通过将
maximumUnitCount
的值设置为1
,您可以保证仅显示一个DateComponentsFormatter
单位(年,月,日,小时或分钟)的差异 .下面的Playground代码显示了如何显示两个日期之间的差异:
请注意
DateComponentsFormatter
会将结果四舍五入 . 因此,4小时30分钟的差异将显示为5小时 .如果需要重复此操作,可以重构代码:
2.获取两个日期之间的差异而不进行格式化
如果您不需要使用格式显示用户的两个日期之间的差异,则可以使用Calendar .
Calendar
有一个方法dateComponents(_:from:to:)
,它具有以下声明:下面使用
dateComponents(_:from:to:)
的Playground代码显示了如何通过仅返回一种Calendar.Component
(年,月,日,小时或分钟)的差异来检索两个日期之间的差异 .如果需要重复此操作,可以重构代码:
在Swift 2.2中
以下是我对上面Swift 3答案的回答 . 这是截至2016年11月的最新版本,Xcode版本为8.2 Beta(8C23) . 使用上面的Sagar和Emin建议中的一些,有时必须让Xcode自动完成以建议语法 . 似乎语法真的改变了这个beta版本 .
buyDate
我是从DatePicker获得的:Leo Dabus回答的一个小补充,提供复数版本,更具人性化 .
斯威夫特3
如果您的目的是获取两个日期之间的确切日期数,您可以解决此问题,如下所示:
这是较短的版本:基本上我试图找到它们之间的区别现在是
Date()
的帖子时间戳 .For XCode Version 8.3.3 & Swift 3.0:
在jose920405中添加了一些答案,使其与 Swift 3.0 及以上版本兼容
使用此代码:
输出为:结果:10年1个月18天