Swift 日期格式返回错误的日期
Swift date format returning wrong date
我需要将 date 转换为 string 然后 string 转换为 日期。日期是“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
其 returning "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)!
其 returning "2020-10-17 1:21:30 PM +0000 - timeIntervalSinceReferenceDate:624633690.0"
它 return 在我将字符串转换为日期后输入了错误的日期。当我将字符串转换为日期时,这次我需要 "2020-10-17 18:51:30+05:30" return.....
你问题中的代码乱七八糟。您尝试在第一个示例中将字符串转换为字符串,在第二个示例中尝试将未指定的内容转换为 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 来获取诸如日期组件和以秒以外的单位为单位的时间间隔之类的东西。您可能认为要获得“明天同一时间”,您只需将 24 * 60 * 60 添加到
Date
但在许多国家/地区,例如我的国家/地区,一年中只有 363 天有效。 Calendar
将正确处理诸如夏令时和闰年之类的事情。
我需要将 date 转换为 string 然后 string 转换为 日期。日期是“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
其 returning "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)!
其 returning "2020-10-17 1:21:30 PM +0000 - timeIntervalSinceReferenceDate:624633690.0"
它 return 在我将字符串转换为日期后输入了错误的日期。当我将字符串转换为日期时,这次我需要 "2020-10-17 18:51:30+05:30" return.....
你问题中的代码乱七八糟。您尝试在第一个示例中将字符串转换为字符串,在第二个示例中尝试将未指定的内容转换为 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 来获取诸如日期组件和以秒以外的单位为单位的时间间隔之类的东西。您可能认为要获得“明天同一时间”,您只需将 24 * 60 * 60 添加到
Date
但在许多国家/地区,例如我的国家/地区,一年中只有 363 天有效。Calendar
将正确处理诸如夏令时和闰年之类的事情。