日期格式swift中的转换问题

时间:2016-03-07 09:47:33

标签: ios xcode swift

我无法将字符串日期转换为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)

1 个答案:

答案 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 打印格式化的日期。