我无法将字符串日期转换为NSDate对象。 请检查以下代码
let stringDate = "06:30 AM"
let formatter = NSDateFormatter()
formatter.dateFormat="hh:mm a"
let local = NSLocale(localeIdentifier: "en_US")
formatter.locale=local
let date = formatter.dateFromString(stringDate)
答案 0 :(得分:1)
输出是预期的,根据你想要达到的目的,你没有做错任何事。
您的stringDate
实例仅包含有关当天时间的信息,而不包含日期(之前的格式也是NSDateFormatter
的唯一格式} formatter
“感兴趣”。因此,以下代码段会生成预期的06:30 AM
输出:
let stringDate = "06:30 AM"
let formatter = NSDateFormatter()
formatter.dateFormat="hh:mm a"
let local = NSLocale(localeIdentifier: "en_US")
formatter.locale=local
if let date = formatter.dateFromString(stringDate) {
print(formatter.stringFromDate(date)) // 06:30 AM
}
NSDate
个实例定义为 time 中的单点(一天中的日期和小时),并参考绝对参考日期:
NSDate
个对象封装了一个时间点,与之无关 任何特定的日历系统或时区。日期对象是 不可变的,表示相对于的不变时间间隔 绝对参考日期(2001年1月1日00:00:00 UTC)。
来自language reference for NSDate
。
因此,除了时间之外,NSDate
个实例还包含日期(即使不是,在您的情况下,使用或显示)。当您为上面的date
分配值时,Swift游乐场会显示日期的时间 ;后者从绝对参考日期06:30
偏移2000-01-01 00:00:00
。如果我们修改上面的例子来打印最终print语句中的所有细节,我们会更清楚地看到这一点:
// ...
if let date = formatter.dateFromString(stringDate) {
formatter.dateStyle = .FullStyle
formatter.timeStyle = .FullStyle
print(formatter.stringFromDate(date))
/* Saturday, January 1, 2000 at 6:30:00 AM Central European Standard Time */
}
(关于以下评论的补充)
请注意打印日期对象本身(例如上面的print(date)
)和使用格式化程序打印日期的**格式化字符串表示**的区别(例如print(formatter.stringFromDate(date))
)。先前只打印日期的.description
属性,这是对象本身内容的默认格式字符串表示形式,而不是日期的受控格式化输出:
<强>声明强>
var description: String { get }
说明
日期对象的字符串表示形式。 (只读)
该表示仅对调试有用。
有许多选项可以获取日期的格式化字符串 包括:日期格式化程序(请参阅
NSDateFormatter
和数据格式 指南)和NSDate
方法descriptionWithLocale:
,dateWithCalendarFormat:timeZone:
,和descriptionWithCalendarFormat:timeZone:locale:
请参阅上面的代码块,了解如何使用NSFormatter
打印格式化的日期。