2013-08-28 79 views
11

NSDateFormatter相對日期格式所以我的目的是推出日期將如下所示:與自定義格式

Today, August 28 
Tomorrow, August 29 
Friday, August 30 
...etc 

的問題是,它似乎我只能得到如此接近。

當我setDoesRelativeDateFormatting:YESsetDateStyleFullsetTimeStyleNone,它產生的結果是這樣的:

Today 
Tomorrow 
Friday, August 30, 2013 

這就產生了一年,沒有產生的月份和日期的今天和明天。

的其他代碼我已經試過是這樣的:

[NSDateFormatter dateFormatFromTemplate:@"eeeedMMM" options:0 
                locale:[NSLocale currentLocale]]; 

,並且產生了以下內容:

Wednesday, August 28 
Thursday, August 29 
Friday, August 30 

看似的DATESTYLE和timeStyle,或相對日期格式將覆蓋自定義格式。

有沒有辦法在不進入自定義實現的情況下完成此日期格式?

在此先感謝!

回答

3

根據有關NSDateFormatter的文檔,我認爲針對您的問題的唯一解決方案是針對您希望相對顯示的日期呈現兩個日期字符串。您應該記住,在不同的語言中,相對日期存在差異。從文檔:

如果日期格式使用相對日期格式,如果可能的話它取代其輸出的日期部分用一個短語,如「今天」和「明天」 - 即表示相對日期。可用的短語取決於日期格式化程序的區域設置;而對於將來的日期,英語可能只允許「明天」,法語可能會允許「明天后一天」。

我相信,如果你定義你將顯示相對例如昨天,今天和明天你可以使用2個NSDateFormatters,第一個顯示相對值,第二個顯示實際的日期,非相對日期只顯示非相對值

+0

rmaddy沒有問這個問題。 – vikingosegundo

+1

訣竅是找出何時發生相對格式化。你不能只依靠前一天和後一天。在其他語言中,例如法語和俄語,您將在'昨天之前'和'明天之後'有相對格式。 – Davyd

+0

輝煌的解決方案! –

2

看起來沒有辦法完成這種日期格式化而沒有進入自定義實現。因此,這個問題的簡短答案是'否'。

但是,問題仍然存在,所以下面是我自己解決問題的方法。

創建NSDateFormatter的子類並實現自定義初始化並覆蓋stringFromDate:方法。

- (instancetype)initWithDateFormat:(NSString *)dateFormat 
{ 
    self = [super init]; 
    if (self) { 
     NSLocale *locale = [NSLocale currentLocale]; 
     self.locale = locale; 

     self.timeStyle = NSDateFormatterNoStyle; 
     self.dateStyle = NSDateFormatterShortStyle; 
     self.doesRelativeDateFormatting = YES; 

     self.dateFormat = dateFormat; 
    } 
    return self; 
} 

- (NSString *)stringFromDate:(NSDate *)date 
{ 
    NSString *dateFormat = self.dateFormat; 
    self.dateFormat = nil; 

    BOOL didRelativeDateFormatting = self.doesRelativeDateFormatting; 
    self.doesRelativeDateFormatting = YES; 

    NSString *result = [super stringFromDate:date]; 

    if ([result rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location != NSNotFound) { 
     self.dateFormat = dateFormat; 
     self.doesRelativeDateFormatting = NO; 
     result = [super stringFromDate:date]; 
    } 

    self.dateFormat = dateFormat; 
    self.doesRelativeDateFormatting = didRelativeDateFormatting; 

    return result; 
} 

由於doesRelativeDateFormattingdateFormat是相互排斥的,我們首先嚐試使用相對格式。由於我們在init方法中設置了self.dateStyle = NSDateFormatterShortStyle,我們知道日期將包含十進制數字,除非它被替換爲「今天」,「明天」以及可能出現在其他語言中的任何字詞。如果我們沒有發現任何數字,我們接受這個結果。

如果字符串中有數字數字,我們假定相對格式沒有發生,所以我們使用我們自己的日期格式。

3

我用這個辦法,斯威夫特3:

struct SharedFormatters { 
    private static let dateWithRelativeFormatting: DateFormatter = { 
     let df = DateFormatter() 
     df.dateStyle = .medium 
     df.doesRelativeDateFormatting = true 
     return df 
    }() 
    private static let dateWithoutRelativeFormatting: DateFormatter = { 
     let df = DateFormatter() 
     df.dateStyle = .medium 
     df.doesRelativeDateFormatting = false 
     return df 
    }() 
    private static let longDateWithoutYear: DateFormatter = { 
     let df = DateFormatter() 
     df.dateFormat = "MMMM d" 
     df.doesRelativeDateFormatting = false 
     return df 
    }() 
    static func string(from date: Date) -> String { 
     let val = dateWithRelativeFormatting.string(from: date) 
     let val2 = dateWithoutRelativeFormatting.string(from: date) 
     return val == val2 ? longDateWithoutYear.string(from: date) : val 
    } 
} 
+1

這實際上是一個聰明的想法。如果你有很多格式化的日期(例如在一個表格中),請注意,因爲這會使格式化數量增加三倍。 –