NSDateFormatter 24小时

Joh*_*ohn 43 iphone objective-c 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"];
Run Code Online (Sandbox Code Playgroud)

谢谢

Voi*_*ter 66

NSDateFormatter遵循Unicode标准的日期和时间模式.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"];
Run Code Online (Sandbox Code Playgroud)

  • 如果用户设置24小时关闭,则不起作用. (43认同)
  • 不是很惊人吗?我刚发现我自己的一个应用程序失败了,因为尽管在格式字符串中使用了HH,但用户设置会覆盖它.疯! (6认同)
  • 如果原始问题中提到的日期格式为24小时且用户的区域设置为12小时,我们该怎么办?在那种情况下[[NSDate date] timeIntervalSinceDate:@"my 24 hour datetime"]返回"nan"......非常讨厌!请问有谁请告诉我如何让这个工作.基本上我将需要使用24小时时钟来计算timeIntervalSinceDate,而不管用户的语言环境设置如何.我不知道该怎么做. (3认同)
  • 这个答案有误导性。我同意 Mavrick3 和 Roger。用户设置会覆盖标准时间模式的 HH。日期格式化程序文档令人讨厌地暗示了这种行为:在所有情况下,您应该考虑格式化程序默认使用用户的区域设置 (currentLocale) 与用户的首选项设置叠加。 (2认同)
  • `NSDateFormatter` 行为在 [技术问答 QA1480](https://developer.apple.com/library/ios/qa/qa1480/_index.html#//apple_ref/doc/uid/DTS40009878) 中进行了解释。 (2认同)
  • 要覆盖用户的设置,请直接设置日期格式化程序的语言环境:`df.locale = ...` (2认同)

cro*_*oto 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];
Run Code Online (Sandbox Code Playgroud)


EvG*_*yin 11

我对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"
Run Code Online (Sandbox Code Playgroud)


Har*_*oom 5

摘自Apple关于 NSDateFormatters 的技术问答

问:我正在使用 NSDateFormatter 解析 Internet 样式的日期,但对于某些地区的某些用户来说这会失败。我设置了一个特定的日期格式字符串;这不应该强制 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
}()
Run Code Online (Sandbox Code Playgroud)