swift2 Swift中的日期/时间自然语言近似

ftf50wuq  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(179)

我正在尝试使用Swift将UTC格式的日期从API转换为人类可读的近似格式。
我正在寻找类似以下内容的内容:
2015年7月14日13时51分423秒

大约两周前
Swift中最好的方法是什么?虽然最好的方法是直接格式化字符串,但我知道这可能需要将字符串转换为NSDate对象。
任何帮助都将不胜感激。
编辑:我的问题被认为是another question的一个可能的重复。下面Tom的解决方案是为Swift编写的,比根据我的情况创建一个新方法要优雅得多。

fkvaft9z

fkvaft9z1#

您需要两个步骤。首先,将日期字符串转换为NSDate

let dateString = "2015-07-14T13:51:05.423Z"

let df = NSDateFormatter()
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = df.dateFromString(dateString)

(If这不是您所得到的字符串的精确表示形式,您必须更改日期格式字符串以使其能够转换)。
接下来,使用NSDateComponentsFormatter获取所需的字符串:

let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full
formatter.includesApproximationPhrase = true
formatter.includesTimeRemainingPhrase = false
formatter.allowedUnits = NSCalendarUnit.WeekOfMonthCalendarUnit

if let pastDate = date {
    let dateRelativeString = formatter.stringFromDate(pastDate, toDate: NSDate())
}

今天是7月28日,所以该字符串的结果是“About 2 weeks”。allowedUnits属性是一个位字段,因此您可以指定任意多个单位类型。

bmvo0sr5

bmvo0sr52#

正如汤姆·哈林顿(Tom Harrington)在回答时所指出的,你可以用NSDateComponentsFormatter来产生一个时刻或时间间隔的口语化表示。
然而,如果你想做的正是这个问题在它的例子中所要求的,也就是产生一个 * 过去时刻相对于现在时刻的口语化表示 *,就像一个面向时间轴的UI一样,那么NSDateComponentsFormatter似乎并不适合。时间间隔值““必须是有限的数字。在创建字符串时,负数被视为正数。
据我所知,最好的选择是TTTTimeIntervalFormatter,它是Mattt Thompson的FormatterKit中的一个独立类。
我制作了一个Xcode 7游戏场RelativeDatePlayground,它比较了NSDateFormatter输出和TTTTimeIntervalFormatter的输出。下面的表格显示了不同相对时间(以秒为单位)的输出。正如你所看到的,NSDateComponentsFormatter似乎不能很好地处理过去的时刻或现在的时刻:

-1488010 |               2 weeks ago |         -1 week remaining
        -1468800 |               2 weeks ago |         -1 week remaining
         -864000 |                1 week ago |       0 seconds remaining
          -86400 |                 1 day ago |          -1 day remaining
          -36000 |              10 hours ago |       -10 hours remaining
           -3600 |                1 hour ago |         -1 hour remaining
            -600 |            10 minutes ago |     -10 minutes remaining
             -60 |              1 minute ago |       -1 minute remaining
             -10 |            10 seconds ago |     -10 seconds remaining
              -1 |              1 second ago |       -1 second remaining
              -0 |                  just now |       0 seconds remaining
               0 |                  just now |       0 seconds remaining
               1 |         1 second from now |        1 second remaining
              10 |       10 seconds from now |      10 seconds remaining
              60 |         1 minute from now |        1 minute remaining
             600 |       10 minutes from now |      10 minutes remaining
            3600 |           1 hour from now |          1 hour remaining
           36000 |         10 hours from now |        10 hours remaining
           86400 |            1 day from now |           1 day remaining
          864000 |           1 week from now |          1 week remaining
         1468800 |          2 weeks from now |         2 weeks remaining
         1488010 |          2 weeks from now |         2 weeks remaining
mwngjboj

mwngjboj3#

从iOS 13 / macOS 10.15开始,你就可以使用RelativeDateTimeFormatter了。感谢@mattt把这个放在你的archived Github README上。

import Foundation

let formatter = RelativeDateTimeFormatter()
formatter.formattingContext = .beginningOfSentence

let date = Date().addingTimeInterval(-67 * 60)
formatter.string(for: date)! // => "1 hour ago"

相关问题