问题描述
我需要将我的日期转换为字符串,然后将字符串转换为日期。日期为“ 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作为时区。这就是为什么在上面的代码中更改了它。
在示例中,我明确指定了string
和date
的类型以显示它们是什么类型。类型推断意味着您可以在常规代码中忽略这些。
作为处理日期的一般规则:
- 始终在代码中使用
Date
。Date
是一种存储自1970年1月1日UTC以来的秒数的类型。 - 仅在将日期显示给用户或与外部系统通信时才将日期转换为字符串。
- 在计算周期等时,请始终使用Calendar以秒为单位获取日期分量和间隔之类的信息。您可能会想获得“明天的同一时间”,您可以在
Date
中添加24 * 60 * 60,但是在许多国家(例如我的国家),一年仅工作363天。Calendar
将正确处理夏时制和leap年。