正如先前提到的,您需要使用DateFormatter来格式化日期对象。最简单的方法是创建一个只读的计算属性(Date extension)。
只读计算属性
具有getter但没有setter的计算属性称为只读计算属性。只读计算属性始终返回一个值,并且可以通过点语法访问,但不能设置为不同的值。
注意:
您必须使用var关键字声明计算属性,包括只读计算属性,因为它们的值是不固定的。let关键字仅用于常量属性,以表明它们一旦作为实例初始化的一部分被设置,其值就无法更改。
您可以通过删除get关键字及其括号来简化只读计算属性的声明:
extension Formatter {
static let date = DateFormatter()
}
extension Date {
var europeanFormattedEn_US : String {
Formatter.date.calendar = Calendar(identifier: .iso8601)
Formatter.date.locale = Locale(identifier: "en_US_POSIX")
Formatter.date.timeZone = .current
Formatter.date.dateFormat = "dd/M/yyyy, H:mm"
return Formatter.date.string(from: self)
}
}
要将其转换回来,您可以创建另一个只读的计算属性,但作为字符串扩展:
extension String {
var date: Date? {
return Formatter.date.date(from: self)
}
func dateFormatted(with dateFormat: String = "dd/M/yyyy, H:mm", calendar: Calendar = Calendar(identifier: .iso8601), defaultDate: Date? = nil, locale: Locale = Locale(identifier: "en_US_POSIX"), timeZone: TimeZone = .current) -> Date? {
Formatter.date.calendar = calendar
Formatter.date.defaultDate = defaultDate ?? calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())
Formatter.date.locale = locale
Formatter.date.timeZone = timeZone
Formatter.date.dateFormat = dateFormat
return Formatter.date.date(from: self)
}
}
使用方法:
let dateFormatted = Date().europeanFormattedEn_US
if let date = dateFormatted.date {
print(date.description(with:.current))
date.europeanFormattedEn_US
}
let dateString = "14/7/2016"
if let date = dateString.toDateFormatted(with: "dd/M/yyyy") {
print(date.description(with: .current))
}