【问题标题】:Swift 3 - UTC to time ago label, thinking 12h / 24h device time changesSwift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化
【发布时间】:2017-01-06 23:24:13
【问题描述】:

我想将时间UTC 转换为“5 秒前”。以前的标签也在考虑手机上的 12h / 24h 变化。因为会崩溃。现在下面的代码行返回标签值我想要在 Playground 中。但不在我的 ios 项目中。它不会进入 If 块。我错过了什么或有什么问题?

    let dateStringUTC = "2016-10-22 12:37:48 +0000"
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"

    if let from = dateFormatter.date(from: dateStringUTC) {

        dateFormatter.dateFormat = "MMM d, yyyy h:mm:ss a"
        let stringFromDate = dateFormatter.string(from: from)
        let dateLast = dateFormatter.date(from: stringFromDate)

        let now = Date()
        let components: NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfMonth]
        let difference = (Calendar.current as NSCalendar).components(components, from: dateLast!, to: now, options: [])

        if difference.second! <= 0 {
            self.timeInfoLbl.text = "now"
        }
        if difference.second! > 0 && difference.minute! == 0 {
            self.timeInfoLbl.text = String(describing: difference.second!) + "s."
        }
        if difference.minute! > 0 && difference.hour! == 0 {
            self.timeInfoLbl.text = String(describing: difference.minute!) + "m."
        }
        if difference.hour! > 0 && difference.day! == 0 {
            self.timeInfoLbl.text = String(describing: difference.hour!) + "h."
        }
        if difference.day! > 0 && difference.weekOfMonth! == 0 {
            self.timeInfoLbl.text = String(describing: difference.day!) + "d."
        }
        if difference.weekOfMonth! > 0 {
            self.timeInfoLbl.text = String(describing: difference.weekOfMonth!) + "w."

            if difference.weekOfMonth! > 52 {
                let number = Float(difference.weekOfMonth!) / 52
                let strYear = String(format:"%.1f", number)
                self.timeInfoLbl.text = strYear + " year"
            }
        }
    }

【问题讨论】:

    标签: ios swift swift3 nsdateformatter date-formatting


    【解决方案1】:

    要将此字符串转换为日期,我会这样做:

    let dateStringUTC = "2016-10-22 12:37:48 +0000"
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss X"
    let date = dateFormatter.date(from: dateStringUTC)!
    

    然后,为了以良好的格式显示经过的时间,请考虑DateComponentsFormatter,例如:

    let now = Date()
    
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.maximumUnitCount = 2
    let string = formatter.string(from: date, to: Date())! + " " + NSLocalizedString("ago", comment: "added after elapsed time to say how long before")
    

    【讨论】:

    • 首先感谢您的关心,我想我在 UTC 到 Date() 转换时遇到问题,如何将 "2016-10-22 12:37:48 +0000" 转换为 Date() 类型正确吗?然后我会在设备时间 12 小时和 24 小时都尝试这个,因为我有一个大错误。
    • 确保设置您的locale,例如dateFormatter.locale = Locale(identifier: "en_US_POSIX")。另外,我会使用ZZZZZX,而不是ZZZ
    • 如果只想查看周数,可以设置allowedUnits,例如formatter.allowedUnits = [.weekOfMonth, .day, .hour, .minute]。如果您真的需要,您可以编写自己的繁琐代码来手动构建字符串,但您为什么要这样做呢?这个日期组件格式化程序是一个不错的选择。不过,坦率地说,我是否得到了你想要的,也不完全清楚为什么这种标准格式不起作用。
    • 没错:它是一个本地化的字符串,以用户的首选语言显示。在向最终用户显示字符串时,这种行为通常更可取。因此,在需要强制执行特定约定(例如,解析和准备与某些 Web 服务交换或存储在某些数据库中的字符串)的情况下使用 Locale(identifier: "en_US_POSIX"),但在向最终用户显示字符串时使用默认的 Locale.current
    • DateComponentsFormatter 有一个calendar 属性,Calendar 对象有一个locale 属性。
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多