如何在没有时区的情况下解析 ISO8061 至今

Posted

技术标签:

【中文标题】如何在没有时区的情况下解析 ISO8061 至今【英文标题】:How to parse ISO8061 to date without timezone 【发布时间】:2018-10-21 01:06:28 【问题描述】:

我从服务器接收 JSON 格式的数据,其中一个字段是 date,其中包含年、月和日:

"date": "2018-03-11",

我不需要确切的时间,只需要一天和一个月。我使用了带有语言环境的 DateFormatter,但我仍然收到来自 UTC 时区的日期。我住在 CET (+1)/ CEST (+2) 时区,所以我想知道解析这个日期的最佳方法是什么。当我从服务器收到"2018-03-11" 时,我想得到:

date = 2018-03-11 00:00:00

日期格式化程序:

private let dateFormatter: DateFormatter = 
       let dateFormatter = DateFormatter()
        dateFormatter.calendar = Calendar(identifier: Calendar.Identifier.iso8601)
        dateFormatter.locale = Locale(identifier: "pl_PL")

        dateFormatter.dateFormat = "yyyy-MM-dd"
        return dateFormatter
    ()

【问题讨论】:

问题是,如果你只需要日期和月份,你仍然需要一个时区......当星期五在法国开始时,在英国仍然是星期四。 提供你目前所拥有的。 @ÁlvaroGonzález 那么来自服务器的日期应该是什么样的? @bcr 我已经用 DateFormatter 更新了帖子 ISO 8601 中的时区表示为本地时间(未指定位置),表示为 UTC。如果您收到“2018-03-11”,您想要零填充小时/分钟 - 对吗?在这种情况下,请修复服务器端以发送 json。 【参考方案1】:

随便用

    dateFormatter.locale = Locale.current
    dateFormatter.timeZone = TimeZone.init(identifier: "UTC")

let dateFormatter: DateFormatter = 
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale.current
            dateFormatter.timeZone = TimeZone.init(identifier: "UTC")
            dateFormatter.dateFormat = "yyyy-MM-dd"
            return dateFormatter
        ()

    print(dateFormatter.date(from: "2018-03-11"))

【讨论】:

不幸的是它返回错误的日期:例如2018-03-11我得到:date = 2018-03-10 23:00:00 +0000; 好的,谢谢。我不知道这是否是最好的解决方案,但它有效?

以上是关于如何在没有时区的情况下解析 ISO8061 至今的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中比较两个ISO 8061持续时间?

Flutter: DateTime 作为改造方法中的参数; DateTime ISO 8061 序列化;改造日期 iso8061 格式

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何编写带有时区但没有时间组件的ISO 8601日期

c++11:使用HowardHinnant/date.h解析ISO8601格式字符串,并解决时区问题