2017-04-13 81 views
2

我想提出一些日期读取ios - 如何显示读取日期“今天,4月14日”?

Yesterday, 13 April 
Today, 14 April 
Tomorrow, 15 April 
Tuesday, 4 April 
Wednesday 5 April 

我试图

 let date = Date(timeIntervalSince1970: value) 

     let dayFormatter = DateFormatter() 
     dayFormatter.dateStyle = .medium 
     dayFormatter.doesRelativeDateFormatting = true 

     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "d MMMM" 
     whenLabel.text = dayFormatter.string(from: date) + ", " + dateFormatter.string(from: date) 

预期如果日期是今天,但是,对于其它日期这是工作的罚款,我得到“Apr 5, 2017, 5 April”

我该如何解决这个问题?

+4

的可能的复制[斯威夫特 - 检查时间戳是昨天,今天,明天或X天前](http://stackoverflow.com/questions/39345101/swift-check-if-a-timestamp-is-yesterday-today-tomorrow-or-x-days-ago) –

回答

1

根据日期是否为今天,您将需要两个完全不同的格式化程序。 doesRelativeDateFormatting不会帮助您处理复杂的格式。

开始通过检查:

if Calendar.current.isDateInToday(date) { 
    // use "Today, " + "d MMMM" pattern 
} else { 
    // use "EEEE" pattern + "d MMMM" pattern 
} 
+0

因此,对于昨天,今天和明天,将它设置为日期formater静态? –

+0

@AshwinIndianic是的,因为你想拥有一个既相对又不相对的格式化器。 “今日”通常代替“4月14日”。这就是为什么你需要一个定制解决方案。 – Sulthan

+0

好吧,明白你的意思了,谢谢你帮助我提高自己的知识水平。 :) –

0

由于Sulthan建议我只是来了解这种代码,

let mydate = Date()//my actual date need to display 
let dateFormatter = DateFormatter() 
if Calendar.current.isDateInToday(mydate) { 
    dateFormatter.dateFormat = "'Today,' d MMMM" 
} 
else if Calendar.current.isDateInYesterday(mydate) { 
     dateFormatter.dateFormat = "'Yesterday,' d MMMM" 
} 
else if Calendar.current.isDateInTomorrow(mydate) { 
     dateFormatter.dateFormat = "'Tomorrow,' d MMMM" 
} 
else{ 
    dateFormatter.dateFormat = "EEEE, d MMMM" 
} 

请更新我,如果我们有什么更好的办法。谢谢

+0

所有静态字符串应该在引号中!例如''今天',d MMMM' – Sulthan

+0

好的,谢谢,(y),我不知道'(单引号)。 –

1

只是为了好玩,这是一个利用本地化的相对日期格式化的解决方案。

它使用的Calendar的延伸,其确定的日期是昨天,今天或明天:

extension Calendar { 
    func isDateInYesterdayTodayTomorrow(_ date: Date) -> Bool 
    { 
     return self.isDateInYesterday(date) || self.isDateInToday(date) || self.isDateInTomorrow(date) 
    } 
} 

func relativeDateString(for date: Date, locale : Locale = Locale.current) -> String 
{ 
    let dayFormatter = DateFormatter() 
    dayFormatter.locale = locale 
    if Calendar.current.isDateInYesterdayTodayTomorrow(date) { 
     dayFormatter.dateStyle = .medium 
     dayFormatter.doesRelativeDateFormatting = true 
    } else { 
     dayFormatter.dateFormat = "EEEE" 
    } 
    let relativeWeekday = dayFormatter.string(from: date) 

    let dateFormatter = DateFormatter() 
    dateFormatter.locale = locale 
    dateFormatter.dateFormat = "d MMMM" 
    return relativeWeekday + ", " + dateFormatter.string(from: date) 
} 
相关问题