取字符串(JSON 格式)日期和快速日期之间的差异



我在 swift 中遇到了一个问题,我无法完全理解 swift Date(( 对象。

我有一个字符串存储在一个格式如下的变量中: "yyyy-MM-dd'T'HH:mm:ssZ">

例如,日期字符串可能是"2014-08-21T19:32:00Z">

我想在 swift 中获取该日期时间和当前日期时间之间的差异。我知道您可以使用 DateFormatter 对象类似地格式化快速日期,但是如何获得两者之间的偏移量?理想情况下,差异将以我可以提取天、小时、分钟等的方式返回。 谢谢。

您需要将字符串日期转换为快速日期,然后才能进行比较。

我有同样的任务,日期可能在 JSON 结果中,也可能不在 JSON 结果中,所以我写了这个方便的小函数来获取日期(根据需要更改日期格式 - 我有两种可能的格式(:

func getDateFromString(_ dateString: String?) -> Date? {
guard let dateString = dateString else {
return nil
}
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
var date: Date?
date = dateFormatter.date(from: dateString)
if date == nil {
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"
date = dateFormatter.date(from: dateString)
}
return date   
}

然后,您需要使用日历和日历组件。

let now = Date()
if let stringDate = getDateFromString("2014-08-21T19:32:00Z") {
let calendar = Calendar.current
let comparison = calendar.dateComponents([.day, .hour, .minute], from: stringDate, to: now)
print("The Difference between the dates is: (comparison.day!) days, (comparison.hour!) hours, and (comparison.minute!) minutes.")
}

必须使用配置了正确 ISO 8601 格式字符串的日期格式化程序将字符串转换为Date。如果您的目标是iOS 10或更高版本,则可以改用非常方便的ISO8601DateFormatter

一旦你有 2 个日期对象,就很容易弄清楚 2 个之间的区别。如果您想将这种差异变回可读性,我建议您DateIntervalFormatterDateComponentsFormatter,具体取决于您的用例。我提供了 2 种不同的方法来访问年、周、日等。

let dateString = "2014-08-21T19:32:00Z"
// iOS 10 or later
let dateFormatter = ISO8601DateFormatter()
// Older deployment targets
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"

if let jsonDate = dateFormatter.date(from: dateString) {
let today = Date()
// Number of seconds between the 2
let difference = today.timeIntervalSince(jsonDate)
let componentsFormatter = DateComponentsFormatter()
componentsFormatter.unitsStyle = .short
componentsFormatter.allowedUnits = [.year, .month, .day, .hour, .minute, .second, .nanosecond]
let string = componentsFormatter.string(from: jsonDate, to: today)
print(string!)

let comparison = Calendar.autoupdatingCurrent.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond], from: jsonDate, to: today)
print(comparison)
}

输出:

2 年, 11 个月, 20 天, 4 小时, 41 分钟, 32 秒

年: 2 个月: 11 天: 20 小时: 4 分钟: 41 秒: 32 纳秒
: 864941162 是闰月: 假

最新更新