快速日期格式返回错误的日期

问题描述

我需要将我的日期转换为字符串,然后将字符串转换为日期。日期为“ 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” 这一次是在我将字符串转换为日期时返回.....

解决方法

您问题中的代码混乱了。在第一个示例中,您尝试将字符串转换为字符串,在第二个示例中,您尝试将未指定的内容转换为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以秒为单位获取日期分量和间隔之类的信息。您可能会想获得“明天的同一时间”,您可以在Date中添加24 * 60 * 60,但是在许多国家(例如我的国家),一年仅工作363天。 Calendar将正确处理夏时制和leap年。