应用程序在设备时间为24小时格式时崩溃

时间:2016-10-15 06:24:12

标签: swift nsdate nsdateformatter

在我的应用程序中,如果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)

4 个答案:

答案 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