如何在 Swift 中解析 ISO 8601 持续时间格式?

2023-11-29

我有一个函数,我用它来格式化字符串。该字符串类似于“PT1H3M20S”,表示 1 小时 3 分 20 秒。在我的函数中,我想将字符串格式化为 1:03:20 并且它工作正常,但有时,我得到像这样的字符串“PT1H20S”,这意味着 1 小时 20 秒,我的函数将其格式化为 1:20让人把它读成1分20秒。有什么建议么?

func formatDuration(videoDuration: String) -> String{
    let formattedDuration = videoDuration.replacingOccurrences(of: "PT", with: "").replacingOccurrences(of: "H", with:":").replacingOccurrences(of: "M", with: ":").replacingOccurrences(of: "S", with: "")
    let components = formattedDuration.components(separatedBy: ":")
    var duration = ""
    for component in components {
        duration = duration.count > 0 ? duration + ":" : duration
        if component.count < 2 {
            duration += "0" + component
            continue
        }
        duration += component
    }
    // instead of 01:10:10, display 1:10:10
    if duration.first == "0"{
        duration.remove(at: duration.startIndex)
    }
    return duration
}

Call it:

print(formatDuration(videoDuration: "PT1H15S")

您还可以只搜索小时、分钟和秒的索引,并使用 DateComponentsFormatter 位置样式来格式化视频持续时间:

创建静态位置日期组件格式化程序:

extension Formatter {
    static let positional: DateComponentsFormatter = {
        let formatter = DateComponentsFormatter()
        formatter.unitsStyle = .positional
        return formatter
    }()
}

以及您的格式持续时间方法:

func formatVideo(duration: String) -> String {
    var duration = duration
    if duration.hasPrefix("PT") { duration.removeFirst(2) }
    let hour, minute, second: Double
    if let index = duration.firstIndex(of: "H") {
        hour = Double(duration[..<index]) ?? 0
        duration.removeSubrange(...index)
    } else { hour = 0 }
    if let index = duration.firstIndex(of: "M") {
        minute = Double(duration[..<index]) ?? 0
        duration.removeSubrange(...index)
    } else { minute = 0 }
    if let index = duration.firstIndex(of: "S") {
        second = Double(duration[..<index]) ?? 0
    } else { second = 0 }
    return Formatter.positional.string(from: hour * 3600 + minute * 60 + second) ?? "0:00"
}

let duration = "PT1H3M20S"
formatVideo(duration: duration)  // "1:03:20"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Swift 中解析 ISO 8601 持续时间格式? 的相关文章

  • 将子字符串从 char* 复制到 std::string 的优雅方法

    我有这个char char line This is a great day string subLine 我要那个subLine会包括 is a great 从第 5 处复制 接下来的 10 个字符 有没有办法做到这一点而不是转换char
  • 为什么快速枚举中的可选项会导致无限循环?

    评估以下代码 我希望打印一次Hello World 相反 它会导致无限循环 有人可以解释为什么吗 let array what for text String in array print Hello World 删除可选的 显然让它只打印
  • iOS 新手。预期的表达错误?

    这看起来很不寻常 因为该方法与我的 showAnswer 方法完全相同 所以我想我应该在这里问 import QuizViewController h interface QuizViewController end implementat
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • 将字符串列表转换为字典

    我有一个清单 Tests run 1 Failures 0 Errors 0 我想将其转换为字典 Tests run 1 Failures 0 Errors 0 我该怎么做 Use a Tests run 1 Failures 0 Erro
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • 在 swift 中获取用户可读的类名版本(在 objc NSStringFromClass 中就可以了)

    Swift 中是否有相当于 NSStringFromClass 的类名 可以提供用户可读的版本 我尝试将它与我创建的本机 Swift 类一起使用 但如您所见 结果似乎是编译器对类名的内部表示 println NSStringFromClas
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • 在 iPhone 和 Cocos2d 中从类类型(+)方法访问对象?

    我有一个类方法 在其中创建并返回类对象 但我想访问同一类中该对象的某些属性 作为一个类方法 我无法在 h 文件中声明该变量 然后在其他方法中访问它 以下是代码 我如何在下面的实例方法中访问 backsprite 或 hudlayer 对象的
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似
  • iPhone / iPad IOS 应用程序仪器内存计数与 task_info 内存计数

    我一直在使用 Instruments Leak Tester 它给出了大约 1 3 meg 的应用程序总分配数字 但是 当使用 task info 时 它会报告更大的内存量 例如 10 20 meg 我想我只是想确认task info正在返
  • Facebook 登录 Apple CNA

    问题 是否可以设置 Facebook 登录以在 CNA 中使用 是否为开发人员提供 CNA 文档 您可以使用任何开发人员工具调试 CNA 屏幕吗 Details 我创建了一个使用电子邮件提交表单或 Facebook 登录按钮的强制门户登录页
  • 子视图控制器旋转方法未被调用

    Summary 我试图将子视图控制器添加到父视图控制器 并让父视图控制器通知子视图控制器旋转事件 但是 旋转消息不会转发到子视图控制器 这是默认行为 为什么这种默认行为没有发生 环境 iOS 7 XCode 5 OSX 10 9 Detai
  • Powershell - 将字符串拆分为由开始和结束字符串划分的数组

    我有一个多行字符串 来自 json 例如 somekey somevalue somekey somevalue somekey somevalue somekey somenumber somekey null 我想将字符串拆分为一个数组
  • Apple Mach-O 链接器错误 armv7s 和 libGoogleAdMobAds.a

    我刚刚升级了我的应用程序以在新的 iPhone5 模拟器上运行 但是当我尝试为我的 iPhone 4S 设备构建它时 我收到此 Apple Mach O Liner 错误 ld 文件是通用的 3片 但不包含 n armv7s 切片 User
  • 即时将图像添加到 AR 资源以进行图像识别

    ARKit1 5介绍图像识别 在代码中 您必须创建一组参考图像 如下所示 let referenceImages ARReferenceImage referenceImages inGroupNamed AR Resources bund
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • AVAudioMixerNode pan 或 AVAudioUnitSamplerstereoPan 属性无法更改 AVAudioEngine 声音输出的左/右平衡

    我有以下代码 它播放单个 MIDI 音符 但我希望能够调整平衡 平移 以便它仅从左扬声器或右扬声器或某些组合中播放 我认为更改 sampler stereoPan 或 engine mainMixerNode pan 也许可以解决问题 但它
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 使用 NSOutlineView 作为文件系统目录浏览器的 Swift 代码

    我已经在这段 Swift 代码上苦苦挣扎了一段时间 但没有发现问题 代码 下面应该提供文件目录作为 NSOutlineView 的数据源 GUI 非常简单 只是一个带有 NSOutlineView 和 OutlineViewControll

随机推荐