这是一个两步过程,第一转换1900-01-01T00:00:00
(被称为RFC 3999或ISO 8601的日期,称为定义该格式的规格)为Date
对象,然后转换该Date
对象回字符串在的01-01-1900
形式:
将字符串转换在1900-01-01T00:00:00
形式为Date
对象,你可以使用ISO8601DateFormatter
:
let formatter = ISO8601DateFormatter()
formatter.formatOptions.remove(.withTimeZone)
let date = formatter.date(from: string)!
这相当于以下DateFormat
,其中一个必须手动设置locale
到en_US_POSIX
(因为RFC 3999/ISO 8601日期使用公历,无论使用什么设备的默认日历类型),并将timeZone
到GMT /祖鲁语,因为通常RFC 3999/ISO 8601个日期表示GMT,除非另有规定:
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = formatter.date(from: string)!
有关的时区和语言环境的重要性更多信息,解析RFC 3999和ISO 8601的日期,看到苹果的Technical Q&A 1480。
然后,该Date
对象转换为一个字符串转换为01-01-1900
(日,月,年),你会使用的dd-MM-yyyy
格式字符串(请注意大写MM
为“月”,将其从mm
区分对于 “分”):
let formatter2 = DateFormatter()
formatter2.dateFormat = "dd-MM-yyyy"
let string = formatter2.string(from: date)
两个关于dateFormat
字符串意见:
如果这个字符串显示到t他可以使用用户dateStyle
而不是dateFormat
,例如,:
formatter2.dateStyle = .short
虽然这会产生稍微不同的格式,例如dd/MM/yy
,这种方法的优点是字符串将被本地化(例如,英国用户将看到MM/dd/yyyy
,他们看到短日期的首选方式)。
它只是取决于您的dd-MM-yyyy
格式的目的。如果是出于内部目的,请继续使用dateFormat
。但如果是在UI中显示日期,请改用dateStyle
,并享受DateFormatter
为您自动执行的本地化。有关更多信息,请参阅DateFormatter
reference中的“使用用户可见的日期和时间表示”部分。
请注意,在没有为此第二个格式化程序指定的timeZone
时,它会假定ISO 8601日期为GMT,而您希望在当地时区中查看日期。例如,(1900-01-01T00:00:00
GMT是1899年12月31日下午4点在加利福尼亚州)。如果您想查看原始ISO 8601对象的日期字符串(未针对时区进行更正),则只需将此第二个格式化程序的timeZone
设置为GMT即可。
formatter2.timeZone = TimeZone(secondsFromGMT: 0)
正如其他人所指出的那样,要避免不必要的重新实例化DateFormatter
对象。所以,你可能会放在这些属性格式化被实例化一次,或者使用extension
:
extension DateFormatter {
static let customInputFormatter: ISO8601DateFormatter = {
let formatter = ISO8601DateFormatter()
formatter.formatOptions.remove(.withTimeZone)
return formatter
}()
static let customOutputFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd-MM-yyyy"
formatter.timeZone = TimeZone(secondsFromGMT: 0) // if you want date in your local timezone, remove this line
return formatter
}()
}
然后:
let input = "1900-01-01T00:00:00"
let date = DateFormatter.customInputFormatter.date(from: input)!
let output = DateFormatter.customOutputFormatter.string(from: date)
print(output)
来源
2017-06-23 18:13:13
Rob
首先,您需要将字符串转换到一个'Date'所以你需要一个匹配的日期格式。没有列出的人甚至接近匹配诸如“1900-01-01T00:00:00”之类的字符串。 – rmaddy
“我正在尝试一些类似的格式”:你可能有更好的机会在抽奖。一个提示?把日期字符串写在你的格式上,尽量匹配它。例如“”EEE,...“永远不会匹配它,并阅读每个字母或其中的几个意思是什么意思http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html# Date_Format_Patterns另一个提示:将你的字符串分成多个部分,并试图找到每个部分的格式。 – Larme