在我的应用程序中,如果iPhone设备时间为12小时格式化,则日期格式化程序可正常工作,但如果设备时间为24小时格式,则应用程序崩溃。
let dateFormatter = NSDateFormatter();
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle;
dateFormatter.dateFormat = "hh:mm a";
var dt1 = dateFormatter.dateFromString(arrSecond.objectAtIndex(n) as! String)
答案 0 :(得分:13)
@Rajan感谢您了解NSLocale
。我将dateformatter的区域设置标识符设置为" en_US_POSIX
"。
我只是在分配日期格式化程序后在我的代码中添加以下行。 dateformatter.locale = NSLocale(localeIdentifier:"en_US_POSIX")
感谢frnd提出这个想法
答案 1 :(得分:4)
南迪尼的回答是正确的。但唯一的问题是,如果您对区域设置进行编码,则日期仅以英语显示。
在我的情况下,我想用法语,这是一个在 Swift 3 中为我工作的解决方法:
dateformatter.locale = Locale(identifier: NSLocale.current.identifier)
答案 2 :(得分:2)
我不得不改变格式化程序:
dateFormatter.dateFormat = "dd MM yyyy hh:mm:ss.SSS"
到此:
dateFormatter.dateFormat = "dd MM yyyy HH:mm:ss.SSS"
答案 3 :(得分:0)
假设您在看到代码后使用的是Swift 2.x版本。
问题是因为您的dateFormatter
包含a
而24小时格式时间我们没有a
因此,为了解决您的问题,您必须检查您的设备是24小时格式还是12小时格式
将数组的索引对象放在变量time
中并保持为var
,因为我们稍后会更改它。
var time = arrSecond.objectAtIndex(n) as! String //this contains 07:45 AM
//Now create your Date Formatter
let dateFormatter = NSDateFormatter();
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle;
//Now check whether your phone is in 12 hour or 24 hour format
let locale = NSLocale.currentLocale()
let formatter : String = NSDateFormatter.dateFormatFromTemplate("j", options:0, locale:locale)!
//we have to change our dateFormatter as per the hour format
if formatter.containsString("a") {
print("phone is in 12 Hour Format")
dateFormatter.dateFormat = "hh:mm a";
} else {
print("phone is in 24 Hour Format")
time = convertTo24HourFormat(time) //time changed to 24 Hour format and AM/PM removed from string
dateFormatter.dateFormat = "HH:mm";
}
let finalDate = dateFormatter.dateFromString(time)
print(finalDate!)
如果您的手机是24小时格式,我们需要一个功能来将您的时间字符串转换为24小时格式。
convertTo24HourFormat
的功能定义是
//Example 08:45 PM to 20:45
func convertTo24HourFormat(time:String) -> String {
var formattedTime = time
if formattedTime.containsString("PM") {
var hour = Int(formattedTime.substringToIndex(formattedTime.startIndex.advancedBy(2)))
if hour != 12 {
hour = hour! + 12
formattedTime.removeRange(Range<String.Index>(start: formattedTime.startIndex, end: formattedTime.startIndex.advancedBy(2)))
formattedTime = "\(hour!)\(formattedTime)"
}
} else {
// For AM time
var hour = Int(formattedTime.substringToIndex(formattedTime.startIndex.advancedBy(2)))
//case for 12 AM
if hour == 12 {
formattedTime.removeRange(Range<String.Index>(start: formattedTime.startIndex, end: formattedTime.startIndex.advancedBy(2)))
formattedTime = "00\(formattedTime)"
}
}
formattedTime = formattedTime.substringToIndex(time.startIndex.advancedBy(5))
return formattedTime
}
但只转换时间对象没有任何意义,因为它会给出错误的日期。
注意: - 强>
只有以convertTo24HourFormat
格式发送时间时,hh:mm a
功能才能正常工作。例如 07:45 AM