Swift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化

Posted

技术标签:

【中文标题】Swift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化【英文标题】:Swift 3 - UTC to time ago label, thinking 12h / 24h device time changes 【发布时间】: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"
            
        
    

【问题讨论】:

【参考方案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 属性。

以上是关于Swift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将日期从 GMT+1 转换为 UTC 时的困惑

Swift UTC 时区不是 UTC

将 DateTime.Now 转换为时间前 C# [重复]

Swift – Balloons.playground – 无法将“纹理”添加到时间线

GMT-8是啥意思?

PHP将DATETIME转换为时间前函数,秒,分钟,小时,天等[重复]