【问题标题】:ios - How to display date read "Today, 14 April"?ios - 如何显示日期为“今天,4 月 14 日”?
【发布时间】:2017-04-13 09:20:01
【问题描述】:

我想展示一些日期

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”

我该如何解决这个问题?

【问题讨论】:

标签: ios swift nsdate nsdateformatter


【解决方案1】:

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

从检查开始:

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

【讨论】:

  • 所以昨天、今天和明天必须在日期格式化程序中将其设置为静态?
  • @AshwinIndianic 是的,因为您想要一个既是相对的又不是相对的格式化程序。 “今天”通常是“4 月 14 日”的替代品。这就是您需要定制解决方案的原因。
  • 好的,明白了,感谢您帮助我提高知识。 :)
【解决方案2】:

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

它使用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)
}

【讨论】:

    【解决方案3】:

    正如 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"
     }
    

    如果我们有更好的方法,请更新我。谢谢

    【讨论】:

    • 所有静态字符串都应该用引号引起来!例如'Today,' d MMMM
    • 好的,谢谢,(y),我不知道 '(单引号)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多