NSDateFormatter 24小时

时间:2010-01-25 20:12:22

标签: objective-c iphone nsdateformatter

我有一个倒数计时器,从当前日期/时间到特定的未来日期/时间倒计时。除了一个问题外,它工作得很好。我使用NSDateFormatter和dateFromString输入未来日期。它似乎无法接受超过12的任何时间(小时),虽然表明它不支持24小时制。有没有办法启用24小时时钟支持或解决方法?以下是我的一些代码:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];

由于

5 个答案:

答案 0 :(得分:65)

NSDateFormatter遵循Unicode standard for date and time patterns。在24小时制时钟内使用“H”表示小时:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];

答案 1 :(得分:53)

我遇到了同样的问题并且使用HH仅在某些设备上工作,例如Roger也验证过。最后,这是对我有用的解决方案,我希望它适用于其他人。找到这个答案是困难的,没有论坛,苹果文档后面的字面上是试验和错误。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

    [dateFormatter setLocale:enUSPOSIXLocale];

    NSString *dateFormat = @"dd/MM/yyyy HH:mm"; //MM for month, mm for minutes

    [dateFormatter setDateFormat:dateFormat];
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    date = [dateFormatter dateFromString:string];

答案 2 :(得分:10)

我对Swift的解决方案:

let formatter = NSDateFormatter()
var defIdentifer = formatter.locale.localeIdentifier
if !defIdentifer.hasSuffix("_POSIX") {
    defIdentifer = defIdentifer+"_POSIX"
    let locale = NSLocale(localeIdentifier: defIdentifer)
    formatter.locale = locale
}
formatter.dateFormat = "HH:mm"

答案 3 :(得分:4)

取自NSDateFormatters上的Apple Technical Q&A

  

问:我正在使用NSDateFormatter来解析互联网风格的日期,但某些地区的某些用户会失败。我已经设置了一个特定的日期格式字符串;不应该强迫NSDateFormatter独立于用户的区域设置工作吗?

     

答:不会。虽然设置日期格式字符串似乎适用于大多数用户,但这不是解决此问题的正确方法。有许多地方格式字符串以意想不到的方式运行。

这就是我在Swift中的表现:

private let dateFormatter: NSDateFormatter = {
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
    dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0)
    return dateFormatter
}()

答案 4 :(得分:1)

当用户在iPhone上设置12小时格式而不更改区域设置和设置时区时,从24小时字符串获取NSDate的目标C版本:

SetState(Node, NewState);