Swift 日期格式返回错误的日期

Posted

技术标签:

【中文标题】Swift 日期格式返回错误的日期【英文标题】:Swift date format returning wrong date 【发布时间】:2020-10-18 07:20:53 【问题描述】:

我需要将我的 date 转换为 string,然后将 string 转换为 date。日期是“2020-10-17 1:22:01 PM +0000

这是我的日期到字符串的转换代码:

                    let formatter = DateFormatter()
                    formatter.locale = Locale(identifier: "en_US_POSIX")
                    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
                     let string = formatter.string(from: "2020-10-17 1:22:01 PM +0000")
                    let createdAT = string

返回“2020-10-17 18:51:30+05:30”

这是我的字符串到日期转换代码:

     let dateFormatter = DateFormatter()
     dateFormatter.locale = Locale(identifier: "en_US_POSIX")
     dateFormatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
     let date = dateFormatter.date(from:date)!

返回“2020-10-17 1:21:30 PM +0000 - timeIntervalSinceReferenceDate : 624633690.0”

在我将字符串转换为日期后,它返回了错误的日期。我需要 "2020-10-17 18:51:30+05:30" 这一次在我将字符串转换为日期时返回.....

【问题讨论】:

2020-10-17 1:21:30 PM +00002020-10-17 18:51:30+05:30是同一时间。 一个 Date 对象没有格式,它只包含时间的表示,所以你的代码是没有意义的。按原样使用原始的 Date 对象,然后在需要显示/打印时执行格式为字符串。 @Paulw11 是的。但是当我将字符串转换为日期时,我需要 020-10-17 1:21:30 PM +0000 到 020-10-17 1:21:30 PM +0000 .. 我需要添加此代码进行什么样的更改 您需要使用DateFormatter 将其转换为字符串并在日期格式化程序上设置适当的时区 @JoakimDanielson,因为我是 swift 新手,请您指导我。带有代码示例 【参考方案1】:

您问题中的代码混乱。您尝试在第一个示例中将字符串转换为字符串,在第二个示例中将未指定的内容转换为 Date

以下是将Date 转换为String 的方法:

import Foundation

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
let string: String = formatter.string(from: Date())

print(string) // prints for example 2020-10-18T10:54:07+01:00

以下是如何将字符串转换为日期

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd' 'HH:mm:ssZ"
let date: Date = formatter.date(from: "2020-10-18 10:59:56+0100")! // In real life, handle the optional properly
print(date)  // prints 2020-10-18 09:59:56 +0000

当您直接打印日期时,它会自动使用 UTC 作为时区。这就是为什么它在上面的代码中改变了它。

在示例中,我明确指定了stringdate 的类型以显示它们是什么类型。类型推断意味着您可以在普通代码中省略这些。

处理日期时的一般规则:

始终在您的代码中使用DateDate 是一种存储自 1970 年 1 月 1 日 UTC 以来的秒数的类型。 仅在向用户显示日期或与外部系统通信时将日期转换为字符串。 在计算周期等时,请始终使用Calendar 来获取日期组件和间隔等信息,而不是秒。您可能会认为要获得“明天同一时间”,您可以将 24 * 60 * 60 添加到 Date 但在许多国家,比如我的国家,一年中只有 363 天有效。 Calendar 将正确处理夏令时和闰年等问题。

【讨论】:

以上是关于Swift 日期格式返回错误的日期的主要内容,如果未能解决你的问题,请参考以下文章

swift中的日期格式错误

Swift - 错误的日期格式(JSON .NET)

使用 Swift Decode 协议格式化日期

SWIFT:从文本字段格式化为日期不起作用

Swift 的 JSONDecoder 在 JSON 字符串中有多种日期格式?

如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致