【问题标题】:NSDateFormatter dateFormat ShortStyle not workingNSDateFormatter dateFormat ShortStyle 不起作用
【发布时间】:2015-05-07 01:39:23
【问题描述】:

我现在对 NSDateFormatter 有一些问题。

当我将 dateStyle 设置为ShortStyle 时,如果我将模拟器的语言设置为简体中文,代码将起作用。如果我将日期设置为2015-04-20,它将显示15/4/20。根据documentation,这个结果是正确的。而且由于我设置了dateFormatter的locale,所以日期会以year/month/date的格式显示,符合中国人写日期的习惯。

短样式

指定一个简短的样式,通常只有数字,例如“11/23/37” 或“下午 3:30”。

如果我将模拟器的语言设置为日语,同样的代码会导致2015/04/20的结果。这与文档的描述不同,但它仍然有效。

但是,如果我将模拟器的语言设置为英文,同样的代码会导致错误。代码显示如下,错误为"fatal error: unexpectedly found nil while unwrapping an Optional value"。它指向let tmpStartDate: NSDate = dateFormatter.dateFromString(self.room!.startdate)!这一行

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let currentTimeZone: NSTimeZone = NSTimeZone.localTimeZone()
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
dateFormatter.timeZone = currentTimeZone
let locale = NSLocale.currentLocale()
dateFormatter.locale = locale
let tmpStartDate: NSDate = dateFormatter.dateFromString(self.room!.startdate)!
let start: String = dateFormatter.stringFromDate(tmpStartDate)

但这很奇怪。如果模拟器的语言是简体中文或日文(虽然有点不同),则将运行相同的代码和相同的日期。但是会导致英文的致命错误。

我不得不说self.room.startdate 不是零。它是从服务器获取的,在任何情况下都不会为零。我什至可以打印出来。

另外,在另一个视图中使用ShortStyle 的类似代码可以正常工作。我不知道为什么会这样。

有谁知道为什么会出现这个问题?如果我真的想使用NSDateFormatterStyle.ShortStyle,而不是将dateFormat直接设置为'yy/MM/dd',该如何解决?

【问题讨论】:

    标签: ios iphone swift xcode6 nsdateformatter


    【解决方案1】:

    朋友看了代码,指出了问题。

    这个问题是由于中文/日文和英文的日期格式不同造成的。在中文/日文中,日期格式为year/month/date。但是英文的日期格式是month/date/year

    在我的代码中,我在从字符串传输日期之前将dateStyle 设置为ShortStyle。它将正常工作,因为开始日期字符串也是year-month-date 格式。但在英语中,ShortStylemonth/date/year。但是开始日期字符串的日期格式仍然是year-month-date。这将导致从字符串中传输日期失败,并导致应用程序崩溃。

    要解决这个问题,只需将dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle 行移到let tmpStartDate: NSDate = dateFormatter.dateFromString(self.room!.startdate)! 行之后。

    然后代码将正常工作,并为不同的地区显示不同的日期格式。 (Year/month/date 用于中文/日文,month/date/year 用于英文。)

    特别感谢我的朋友 SorziaX,虽然他没有 stackoverflow 帐户。

    【讨论】:

    • 我已经提到类似的代码可以在另一个视图中正常工作。那是因为在那个观点中,我以正确的顺序编写了代码。而且我没有意识到这些观点之间的差异。无论如何,这会根据不同的日期格式导致不同的结果。
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多