如何将日期字符串快速转换为 NSDate 类型
Posted
技术标签:
【中文标题】如何将日期字符串快速转换为 NSDate 类型【英文标题】:how to convert a date string into a NSDate type swift 【发布时间】:2018-09-13 04:03:40 【问题描述】:我正在尝试获取格式为 dd/mm/yyyy 的字符串并将其转换为 NSDate,以便我可以存储生日。日期、月份和年份被验证为真实日期(也不是将来的日期),所以我知道它们是正确的。它们由用户作为文本字段输入,我想我可以将 dateString
设为任何我想要的有用的格式。
let day = dayTextField.text
let month = monthTextField.text
let year = yearTextField.text
let dateString = "\(day)/\(month)/\(year)"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let birthdate: NSDate = dateFormatter.date(from: dateString) as NSDate
当我尝试将日期字符串转换为 NSDate 时,我的问题是最后一行,我收到以下错误:
'Date?' is not convertible to 'NSDate'; did you mean to use 'as!' to force downcast?
我可以在“(来自:dateString
)”之后强制转换,但我认为这不是正确的做法。
您能提供的任何帮助和见解将不胜感激!谢谢
【问题讨论】:
不要在 Swift 中使用NSDate
。使用Date
。
你为什么敢用NSDate
而不是Date
?我不认为这样做是正确的。
您好!我使用它是因为我使用 Parse 服务器作为我的后端,而这里,docs.parseplatform.org/ios/guide/#data-types,他们使用 NSDate。我不完全理解使用 Date 的好处。是不是因为某种原因好多了?
Date
是原生的 Swift 类(实际上是结构)。 NSDate
是旧的 Objective-C 类。
您是否注意到该页面中 Swift 中的一些示例代码使用 String
而不是 NSString
?当您想使用导入的 Parse API 时,您可以在 Swift 代码中使用 Date
而不是 NSDate
。
【参考方案1】:
如果您让用户从UIDatePicker
中选择一个日期,对您和用户来说都更容易。这有很多优点:
date
属性获取所选日期。您不需要所有这些格式化程序和东西
您可以设置用户可以通过maximumDate
属性选择的最大日期。这样您就不必手动检查它是否在将来。只需将maximumDate
设置为现在即可。
日期选择器将根据用户的区域设置使用不同的格式。您完全不必担心。
请记住将datePickerMode
设置为.date
!
至于NSDate
的转换,你可以通过这个表达式轻松完成:
datePicker.date as NSDate
如果你坚持使用三个文本字段,你可以这样做:
dateFormatter.date(from: dateString) as NSDate? // note that this produces an optional
【讨论】:
谢谢!我将尝试使用 UIDatePicker,如果这不起作用,请使用“as NSDate?”解决方案。【参考方案2】:您的代码运行良好,因此请检查您的文本字段中是否存在您的变量中的值
let day = "10"
let month = "12"
let year = "2018"
let dateString = "\(day)/\(month)/\(year)"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"
let birthdate: NSDate = dateFormatter.date(from: dateString) as! NSDate
print(birthdate)
但我建议您使用Date
而不是NSDate
。
【讨论】:
您好 Mahesh,感谢您的回复。我真的希望它成为 NSDate。为什么我要像你一样强制施放它?强制将日期转换为 NSDate 是否可以接受? @thalacker 那么它也是工作代码我刚刚通过分配静态日期和工作正常对其进行了测试,是的,您可以将日期转换为 NSDate :) 请不要使用强制解包。教人们强制打开包装会在以后强制打开应用程序开始崩溃时咬他们。 @Cristik 同意这就是为什么我建议使用 Date 而不是 NSDate 来避免强制换行NSDate
不是此处强制展开的原因。你可以写as NSDate?
,那里没有强制解包。以上是关于如何将日期字符串快速转换为 NSDate 类型的主要内容,如果未能解决你的问题,请参考以下文章