Swift - 从 ISO8601 日期字符串检索时区

2024-04-17

我以这种格式保存在数据库中的日期 - “yyyy-MM-dd'T'HH:mm:ssZ”。例如,“2018-05-17T11:15:00+0330”。时区有所不同,以用户本地时区为准。

我想检索并显示日期,如“2018 年 5 月 17 日上午 11 点 15 分”,将日期/时间保持在保存时的时区。我怎样才能做到这一点?

我试过这个。

let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
//formatter.timeZone = ???
print(formatter.date(from: dateString))

但我获取本地时区的 Date 对象并将其转换为日期字符串,也显示本地时区的日期。

有没有这样的事情,https://stackoverflow.com/a/46216251/1373592 https://stackoverflow.com/a/46216251/1373592,在斯威夫特?

Thanks.


这是一个小扩展TimeZone我刚刚振作起来。您可以使用它来创建一个TimeZone来自 ISO8601 日期字符串。它将按以下格式处理字符串中的时区:

  • Z(UTC 时间)
  • +/-HH
  • +/-HHmm
  • +/-HH:mm

这是扩展:

extension TimeZone {
    init?(iso8601: String) {
        let tz = iso8601.dropFirst(19) // remove yyyy-MM-ddTHH:mm:ss part
        if tz == "Z" {
            self.init(secondsFromGMT: 0)
        } else if tz.count == 3 { // assume +/-HH
            if let hour = Int(tz) {
                self.init(secondsFromGMT: hour * 3600)
                return
            }
        } else if tz.count == 5 { // assume +/-HHMM
            if let hour = Int(tz.dropLast(2)), let min = Int(tz.dropFirst(3)) {
                self.init(secondsFromGMT: (hour * 60 + min) * 60)
                return
            }
        } else if tz.count == 6 { // assime +/-HH:MM
            let parts = tz.components(separatedBy: ":")
            if parts.count == 2 {
                if let hour = Int(parts[0]), let min = Int(parts[1]) {
                    self.init(secondsFromGMT: (hour * 60 + min) * 60)
                    return
                }
            }
        }

        return nil
    }
}

还有一个测试:

print(TimeZone(iso8601: "2018-05-17T11:15:00+0330"))

您可以结合此解析和格式化,以便最终结果采用原始时区。

let dateString = "2018-05-17T11:15:00+0330"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
formatter.locale = Locale(identifier: "en_US_POSIX")
if let date = formatter.date(from: dateString), let tz = TimeZone(iso8601: dateString) {
    let newFmt = DateFormatter()
    newFmt.dateStyle = .medium
    newFmt.timeStyle = .short
    newFmt.timeZone = tz
    let newString = newFmt.string(from: date)
    print(newString)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift - 从 ISO8601 日期字符串检索时区 的相关文章

随机推荐

  • 如何在 Windows 计算机上编译适用于 Linux 的 .NET Core 应用程序

    我正在 Windows 10 计算机上开发一个 NET Core 应用程序 使用 Visual Studio 2015 update 3 Microsoft NET Core 1 0 1 VS 2015 Tooling Preview 2
  • 是否可以在具有 $elemMatch 投影的同一集合上使用查询投影?

    我知道您可以使用以下方法限制子集合数组中的项目 elemMatch http docs mongodb org manual reference operator projection elemMatch 作为投影 当这样使用它时 它会返回
  • 分割视图控制器必须是根视图控制器

    每当我尝试以模态方式呈现 UISplitViewController 时 应用程序就会崩溃 因此它必须始终是根视图控制器 谁能证实这一点吗 来自Apple iPad 编程指南 http developer apple com iphone
  • ROracle dbWriteTable 为 R DATE 列创建 Oracle TIMESTAMP 列

    我正在尝试在 Windows 7 64 位上使用 64 位 R3 0 0 中的 ROracle 包 1 1 10 将一些数据上传到我的 Oracle 11g 数据库 ROracle 帮助dbWriteTable states 日期和 POS
  • 在 Pandas 图中添加图例

    我正在使用 Pandas Plot 绘制密度图 但我无法为每个图表添加适当的图例 我的代码和结果如下 for i in tickers df pd DataFrame dic 2 i mean np average dic 2 i std
  • Telegram (Telesharp) - 海量请求(讨论防洪限制)

    我在用着TLSharp https github com sochix TLSharp用于连接到 Telegram 服务 我想搜索 400 000 个频道 请致电服务人员搜索用户异步40万次 我每 15 秒调用一次此服务 但我得到了 1 天
  • Python 读取命名为 PIPE

    我在 linux 中有一个命名管道 我想从 python 中读取它 问题在于 python 进程连续 消耗 一个核心 100 我的代码如下 FIFO var run mypipe os mkfifo FIFO with open FIFO
  • 如何解决 Heroku 上部署的 python 应用程序上的“500 内部服务器错误”?

    基本上 我有一个即将到来的学校项目 任何计算机科学主题 我决定构建一个元数据查看器 我不是程序员或编码员 我的编码课程今年开始 这个项目只是为了介绍 我可以使用在线资源 所以 我刚刚看到了这个GitHub 存储库 https github
  • 如何 git 推送 reflog?

    有没有办法将引用日志推送到远程 这似乎是一件非常有用的事情 但我不知道如何做到这一点 我正在设想类似的事情git push include reflogs 最后 我希望遥控器在推送时有一份引用日志的逐字副本 我尝试使用 mirror 但是
  • 如何使用 Qt 使用鼠标更改网格布局单元格的大小?

    我使用网格布局 水平和垂直 我喜欢这样一个事实 调整窗口大小时会填充整个窗口内容 但这个扩展管理不善 我经常想只改变网格布局中一列的大小而不改变窗口的大小 例如在 Windows 资源管理器中 有两列 左侧的目录列表及其从左侧到右侧的内容
  • 将 pandas groupby 结果合并回 DataFrame

    我有一个看起来像这样的数据框 idn value 0 ID1 25 1 ID1 30 2 ID2 30 3 ID2 50 我想在此框架中添加另一列 即按 idn 分组的最大 值 我想要一个看起来像这样的结果 idn value max va
  • SD卡传输(存储空间不足)

    我试图让我的应用程序能够移动到 SD 卡 到目前为止 我已将属性 android installLocation auto 添加到我的清单文件中 当我尝试在手机上将应用程序的存储选项从内部移动到外部 75MB 时 可以选择移动它 但在完成
  • 通过 HTTPS 的 Ajax GET 请求

    我怎样才能发送ajaxGET请求结束HTTPS get抛出这个 XMLHttpRequest cannot load https Origin null is not allowed by Access Control Allow Orig
  • 让人们在电影院就座

    这是基于我读到的一篇关于大型软件公司提出的谜题和面试问题的文章 但它有一个转折 一般问题 有一种算法可以让人们在电影院就座 让他们直接坐在朋友旁边 而不是敌人旁边 技术问题 给定一个 N M 网格 用 N M 1 项填充网格 每个项目都有一
  • 作业计划程序未在 Android N 上运行

    作业计划程序在 Android Marshmallow 和 Lollipop 设备上按预期工作 但在 Nexus 5x Android N 预览版 上未运行 安排作业的代码 ComponentName componentName new C
  • Chrome 堆快照——分离节点没有颜色

    我正在跟进本教程 https developers google com web tools chrome devtools memory problems 在 使用堆快照发现分离的 DOM 树内存泄漏 下 当我搜索分离节点时 我看到一堆
  • 如何在 Spring 中将对象添加到应用程序范围

    我们可以使用设置请求属性Model or ModelAndViewSpring 中的对象 我们可以用 SessionAttributes将属性保留在会话范围内 那么我怎样才能将属性放入applicationSpring中的作用域 sprin
  • 四叉树和Kd树

    我有一组不同位置的纬度和经度 也知道我当前位置的纬度和经度 我必须找出距离当前位置最近的地方 Kdtree 和四叉树中哪种算法最适合从纬度和经度集合中找出邻居位置 一种相对于另一种有什么优势 我们如何在 C 中将这些实现到算法中以实现上述目
  • 可以集成到 C# 应用程序中的 Diff 工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Swift - 从 ISO8601 日期字符串检索时区

    我以这种格式保存在数据库中的日期 yyyy MM dd T HH mm ssZ 例如 2018 05 17T11 15 00 0330 时区有所不同 以用户本地时区为准 我想检索并显示日期 如 2018 年 5 月 17 日上午 11 点