44

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

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

6 回答 6

67

NSDateFormatter 遵循日期和时间模式的 Unicode 标准。使用 'H' 表示 24 小时制的小时:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"];
于 2010-01-25T20:26:44.480 回答
57

我遇到了同样的问题,使用 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];
于 2013-12-26T23:07:27.650 回答
12

我在 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"
于 2016-06-03T10:00:52.803 回答
4

我最近遇到了类似的问题,而不是我的应用程序中的HH, NSDateFormatterignored hh, a(AM/PM Symbol) 和G(cyclic era name)。

我惊讶地发现,如果我去我的设备的本地化设置并做出一些随机选择,所有的怪胎都消失了,错误不会再次产生。很奇怪。

然后我在模拟器上进行了测试以对其进行一些研究。有我的解决方案:

创建 之后NSDateFormatter,即使您正在使用当前语言环境,也要显式设置 locale 属性,更重要的是,不要使用[NSLocale currentLocale],这个是错误的,并且可以通过用户设置以某种方式“覆盖”,使用systemLocale或使用语言环境标识符显式创建NSLocale实例.

于 2015-12-21T10:56:43.727 回答
4

摘自关于 NSDateFormatters的Apple 技术问答

问:我正在使用 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
}()
于 2016-11-15T12:50:16.753 回答
2

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

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSString *localeId = dateFormatter.locale.localeIdentifier;
if (! [localeId hasSuffix:@"_POSIX"]) {
    localeId = [localeId stringByAppendingString:@"_POSIX"];
    dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId];
}
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss";

NSDate *date  = [dateFormatter dateFromString:dateText];
于 2018-01-11T11:46:15.123 回答