将 TimeInterval 转换为字符串 <del>String 转换为时间间隔</del>

Posted

技术标签:

【中文标题】将 TimeInterval 转换为字符串 <del>String 转换为时间间隔</del>【英文标题】:Convert TimeInterval To String <del>String To Time Interval</del> 【发布时间】:2016-11-30 16:26:12 【问题描述】:

我有一个TimeInterval,我必须将其转换为String,以便将其添加到Dictionary,该Dictionary 通过WatchConnectivity 从Apple Watch 传递到iPhone。

现在我在 iPhone 上拥有 String,我需要将其转回 TimeInterval,但我似乎无法弄清楚。

(我需要在显示锻炼持续时间的UILabel 中显示此内容。)

有什么想法吗?

举例

观看

00:15:15(小时、分钟、秒)变成“915.012948989868”

let myDouble = computeDurationOfWorkout(withEvents: hkWorkout?.workoutEvents, startDate: hkWorkout?.startDate, endDate: hkWorkout?.endDate)
let myDoubleString = String(myDouble)
durationVariableString = myDoubleString 

iPhone

需要将“915.012948989868”转回00:15:15

【问题讨论】:

这个怎么样:***.com/questions/26794703/… 你的问题很混乱。您似乎已经有了将TimeInterval 转换为hh:mm:ss 格式的字符串的代码。看来您已经有了将字符串转换回TimeInterval(双精度)的代码。你到底在寻求什么帮助? @toddg 我会查看那个链接,谢谢! @rmaddy 我没有看到我有代码可以将字符串转换回TimeInterval,这正是我正在寻找的。但也许我弄错了,你看到了我完全遗漏的东西,这肯定是这种情况。你说的是let myDouble = computeDurationOfWorkout(withEvents: hkWorkout?.workoutEvents, startDate: hkWorkout?.startDate, endDate: hkWorkout?.endDate)这行吗?这部分来自 HealthKit,但是当我在 iPhone 上时,我只是想从传递给我的 String 中提取。 您只想将 915 转换为 00:15:15 吗? 【参考方案1】:

使用calendar.dateComponents,您可以将915 转换为00:15:15

func stringFromTimeInterval (interval: String) -> String 
        let endingDate = Date()
        if let timeInterval = TimeInterval(interval) 
            let startingDate = endingDate.addingTimeInterval(-timeInterval)
            let calendar = Calendar.current

            var componentsNow = calendar.dateComponents([.hour, .minute, .second], from: startingDate, to: endingDate)
            if let hour = componentsNow.hour, let minute = componentsNow.minute, let seconds = componentsNow.second 
                return "\(hour):\(minute):\(seconds)"
             else 
                return "00:00:00"
            

         else 
            return "00:00:00"
        
    

【讨论】:

感谢您的回复!这不太合适,因为我需要传入 String 作为参数,而不是 TimeInterval 作为参数。然后我需要返回一个TimeInterval,而不是返回一个String。有什么想法吗? 你需要一个函数来传递 00:15:15 并且它会返回 915 ? 我传入String "915.012948989868" 并返回TimeInterval "00:15:15" 的函数。比如func timeIntervalFromString (string: String) -&gt; TimeInterval 什么的? 00:15:15 不是 TimeInterval,TimeInterval 总是以秒为单位指定,也可以在上面的函数中将 TimeInterval 转换为 String @SRMR 更新了我的答案,该函数现在将获取字符串并返回字符串【参考方案2】:

这可以作为 TimeInterval 的扩展来完成。此外,此版本通过填充它们正确处理分钟/秒

extension TimeInterval 
    var formatted: String 
        let endingDate = Date()
        let startingDate = endingDate.addingTimeInterval(-self)
        let calendar = Calendar.current

        var componentsNow = calendar.dateComponents([.hour, .minute, .second], from: startingDate, to: endingDate)
        if let hour = componentsNow.hour, let minute = componentsNow.minute, let seconds = componentsNow.second 
            return "\(String(format: "%02d", hour)):\(String(format: "%02d", minute)):\(String(format: "%02d", seconds))"
         else 
            return "00:00:00"
        
    

并处理 String -> TimeInterval 转换内联。

TimeInterval(intervalAsString).formatted

【讨论】:

【参考方案3】:

与其将时间间隔变成字符串,不如将其变成可以添加到字典中的 NSNumber。 NSTimeInterval 只是一个双精度数,因此您可以轻松地将它转换为双精度数。

let timeInterval: TimeInterval = 915.012948989868

let dict = ["TimeIneterval": NSNumber(value: timeInterval)]

if let extractedTimeInterval: TimeInterval = dict["TimeIneterval"] as? TimeInterval 

    print(extractedTimeInterval)

【讨论】:

感谢您的回复!我会试试这个。一旦我通过字典将NSNumber 传递给iPhone,一旦我在iPhone 上获得NSNumber,我是否只需将其转换回TimeInterval

以上是关于将 TimeInterval 转换为字符串 <del>String 转换为时间间隔</del>的主要内容,如果未能解决你的问题,请参考以下文章

类不能转换为另一个类

从数据库表中展平数据

将 List<boolean> 转换为字符串

Flutter - 有啥方法可以将字符串转换为列表并将 list<String> 转换回字符串?

将数组<字符串>转换为字符串[重复]

将 Vector<int> 转换为字符串 [重复]