2013-01-09 63 views
8

Unicode日期格式模式指南(here)指出,將格式附加'a'會得到期間(例如AM或PM),例如確保上午/下午(期間)不出現在NSDateFormat stringFromDate

[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或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被追加AM/PM,甚至當我這樣申請日期格式字符串:用戶的設置

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle]; 

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

奇,你介意張貼整個方法,其中這種情況正在發生或更相關的片斷,如果方法體過大? –

+0

它值得展示MyDateFormatter子類。 iE是否錯誤地覆蓋了'setDateFormat:'和類似的方法? – vikingosegundo

回答

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 
+0

是否返回當前日期?我不這麼認爲,它只是從日期中刪除'AM/PM'。 –

2

它實際上依賴。

請參閱Fixed Formats數據格式指南的一部分。請注意這句話:

在iOS中,用戶可以覆蓋默認的AM/PM與24小時的時間 設置。這可能會導致NSDateFormatter重寫您設置的格式字符串 。

而且在該段的末尾:

時的表示可以是13:00。但是,在iOS中,如果 用戶已將24小時時間切換爲關閉,則時間可能是下午1:00。

+1

指出,謝謝:但是,這並不能解釋我剛纔在上面強調的兩種情況。用戶設置尚未更改,但省略了AM/PM;一個不是 – Damo

0

一種選擇是創建自己的NSFormatter。當我無法讓Xcode的Interface Builder中的格式化器執行我想要的操作時,我在代碼上做了這些操作。當然,我只是在尋找小時,分鐘和秒鐘,而不是完整的日期。

至於內存泄漏:如果可以,請使用ARC。如果不能,請使用Xcode的靜態分析器來嘗試追蹤不適當的保留計數。

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]; 
相關問題