NSDate 在 Swift 中返回错误的日期

Posted

技术标签:

【中文标题】NSDate 在 Swift 中返回错误的日期【英文标题】:NSDate returning wrong date in Swift 【发布时间】:2016-01-31 17:40:10 【问题描述】:

今天是 2016 年 2 月 1 日,我刚刚打开我的工作应用程序以继续我的工作,这让我很震惊。

这是一个日期的集合视图,我在一月份没有发现任何问题,因为还没有一个月。

这是代码,

func dF(someDate:NSDate) -> (String)
let monthFormat = NSDateFormatter()
let dayFormat = NSDateFormatter()
monthFormat.dateFormat = "MMM"
dayFormat.dateFormat = "D"

let aMonth = monthFormat.stringFromDate(someDate)
let aDay = dayFormat.stringFromDate(someDate)

//concatenate strings
let conString = aMonth + " " + aDay

return (conString)



//from today to 7th day, to be used in ScrollView
let day1 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: 0, toDate: NSDate(), options: [])
let day2 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -1, toDate: NSDate(), options: [])
let day3 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: [])
let day4 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -3, toDate: NSDate(), options: [])
let day5 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -4, toDate: NSDate(), options: [])
let day6 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -5, toDate: NSDate(), options: [])
let day7 = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -6, toDate: NSDate(), options: [])
let titles = [dF(day1!), dF(day2!), dF(day3!), dF(day4!), dF(day5!), dF(day6!), dF(day7!)]

我希望 day1 将当前日期传递给函数 dF 并对其进行格式化。

所以我进行了一些检查以确保我得到了正确的日期 当前时间:我所在时区的 2016 年 2 月 1 日凌晨 1:08

print(day1)
print(day2)
print(ddd)

这是控制台的结果:

可选(2016-01-31 17:08:47 +0000)

可选(2016-01-30 17:08:47 +0000)

2 月 32 日

我怀疑我的 NSDateComponent 设置不正确/与本地时区不相上下。有什么想法吗?

【问题讨论】:

阅读日期格式说明符的文档。 D 并不是你想的那样。 与其他任何领域相比,如果您认为在处理日期和日历方面存在错误,则该错误很可能出在您的代码中,或者您的期望是错误的。 【参考方案1】:
    您在月份中使用了错误的说明符。 您正在以最困难的方式创建日期字符串。

试试这个:

斯威夫特 3/4:

func dF(_ someDate: Date) -> String 
    let format = DateFormatter()
    format.dateFormat = "MMM d"
    // For a more localized format, use the following instead:
    // format.setLocalizedDateFormatFromTemplate("MMMd")        

    let conString = format.string(from: someDate)

    return conString

老斯威夫特 2 答案: func dF(someDate:NSDate) -> (String) 让格式 = NSDateFormatter() format.dateFormat = "MMM d"

    let conString = format.stringFromDate(someDate)

    return (conString)

【讨论】:

这问题困扰我,我还是解决不了,你介意看看吗? ***.com/questions/35115936/… 我建议使用format.setLocalizedDateFormatFromTemplate("MMMd") 设置格式,否则将无法正确本地化。【参考方案2】:

更快捷的方式来解决您的问题。适用于 Swift 3 及更高版本。

let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "MMM d"
let result = formatter.string(from: date)

输出

"May 12"

【讨论】:

以上是关于NSDate 在 Swift 中返回错误的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期类型保存到 Swift Core Data 中实体的属性?

如何在 Swift 中从 NSDate 获取日、月和小时

Xcode Entity Core Data - NSDate 错误的年份? [复制]

Swift NSDate Xcode 错误 - SourceKitService 终止

谓词,从 NSDate 中按年份过滤,产生一个 nil 日期和一个讽刺的 Xcode 错误

Swift 2 - 如果值在当前日期之前,则删除数组中的 NSDate 值