8

Unicode 日期格式模式指南(此处)指出,将“a”附加到格式将获得句点(例如 AM 或 PM),例如,

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss a"];

但是,我希望确保不出现期间信息,但我找不到执行此操作的格式字符串。我使用的格式字符串如下:

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

不幸的是,当我使用 stringFromDate 时,我得到以下信息:

2013-01-09T11:11:00 AM

我不希望简单地从结果字符串中删除 AM 或 PM,因为不同日历等中的句点语法可能不同,我只想停止出现句点信息。

----8<------

考虑以下代码

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSString *stringDate = [formatter stringFromDate:[NSDate date]];

self.labelOutput.text = stringDate;

[formatter release];

此代码将生成我想要的格式的字符串 - 但是出于内存管理原因我不能使用它。我正在开发的应用程序受到 NSDateFormatter 内存泄漏的困扰。所以我们使用一个单例类来为应用程序提供一个固定数量的 NSDateFormatters,这些 NSDateFormatters 永远不会被释放,因此我们最大限度地减少了泄漏的内存量。不幸的是,即使我这样应用日期格式字符串,这些静态 NSDateFormatter 也会附加 AM / PM:

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle];

[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
4

5 回答 5

6

根据日期格式化程序在运行相同 iOS 版本的不同设备上的不同输出,将您的本地设置NSDateFormatteren_US_POSIX将解决此问题。

附加设置 Local 您可能希望避免时区设置问题,例如:
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

于 2013-04-11T19:38:10.557 回答
2

这实际上取决于用户的设置。

请参阅数据格式化指南的固定格式部分。注意这句话:

在 iOS 中,用户可以覆盖默认的 AM/PM 与 24 小时时间设置。这可能会导致 NSDateFormatter 重写您设置的格式字符串。

在段落的最后:

时间的表示可以是 13:00。但是,在 iOS 中,如果用户将 24-Hour Time 切换为 Off,则时间可能是下午 1:00。

于 2013-01-09T11:33:24.610 回答
1

您需要在此处使用 POSIX 示例代码

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

      [rfc3339DateFormatter setLocale:enUSPOSIXLocale];
      [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
      [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

      // Convert the RFC 3339 date time string to an NSDate.
      NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
于 2014-06-24T12:45:48.037 回答
0

这是我已经确定的答案。这有点简单,但它可以完成工作。

@interface NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date;

@end

@implementation NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date
{
    NSString *stringWithPotentialPeriodInformation = [self stringFromDate:date];
    NSString *stringWithNoAMInformation = [stringWithPotentialPeriodInformation stringByReplacingOccurrencesOfString:[self AMSymbol] withString:@""];
    NSString *stringWithNoPeriodInformation = [stringWithNoAMInformation stringByReplacingOccurrencesOfString:[self PMSymbol] withString:@""];

    return stringWithNoPeriodInformation;
}

@end
于 2013-01-25T13:18:04.410 回答
0

一种选择是创建自己的 NSFormatter。当我无法让 Xcode 的 Interface Builder 中的格式化程序来执行我想要的操作时,我在我的代码上这样做了。当然,我只是在寻找小时、分钟和秒,而不是完整的日期。

至于内存泄漏:如果可以,请使用 ARC。如果不能,请使用 Xcode 的静态分析器尝试追踪不正确的保留计数。

于 2013-01-17T21:32:26.547 回答