如何用人类语言显示日期,例如“今天在xx:xx pm”,“昨天在xx:xx am”?

时间:2014-07-02 21:03:33

标签: ios nsdate swift nsdateformatter

我有一个日期“2014-07-02 20:57:38 +0000”,我想将其格式化为“今天晚上8:57”。 我希望如果一个字符串是昨天,然后将其显示为“昨天上午9:00”。如果它既不是今天也不是昨天,只需显示实际日期,如“27/6 at 7:53 pm”。

我能够通过下面的代码获得“8:57 AM”等格式的时间。

            var formatter : NSDateFormatter = NSDateFormatter()
            formatter.dateFormat = "h:mm a"

            // message.createdAt is the date
            let dateString = formatter.stringFromDate(message.createdAt)
            println(dateString)

            //output = 8:57 AM

但是,当我使用以下代码时,它会返回一个空白字符串。

            var formatter : NSDateFormatter = NSDateFormatter()
            formatter.dateFormat = "h:mm a"
            formatter.doesRelativeDateFormatting = true  //<-- This doesn't work

            let dateString = formatter.stringFromDate(message.createdAt)
            println(dateString)

            //output = (nothing, its a blank string)

如何使这项工作在Swift中显示“今天”或“昨天”?

3 个答案:

答案 0 :(得分:26)

它是空白的原因是您的日期格式只有时间组件。结合.doesRelativeDateFormatting,为您提供空字符串。如果您想要这种自定义时间格式,我认为您需要单独的格式化日期和时间:

let now = NSDate()

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .MediumStyle
dateFormatter.doesRelativeDateFormatting = true

let timeFormatter = NSDateFormatter()
timeFormatter.dateFormat = "h:mm a"

let time = "\(dateFormatter.stringFromDate(now)), \(timeFormatter.stringFromDate(now))"
println(time)      // prints "Today, 5:10 PM"

答案 1 :(得分:10)

使用Swift 3,Apple Developer API Reference说明了DateFormatter的{​​{3}}属性:

  

在使用固定格式表示时,您应该只设置此属性,如dateFormat中所述。对于用户可见的表示形式,如果使用预定义的样式无法实现所需的格式,则应使用Working With Fixed Format Date RepresentationsdateStyle属性或timeStyle方法;这两个属性和此方法都提供了适合显示给用户的本地化日期表示。

DateFormatter setLocalizedDateFormatFromTemplate(_:)属性具有以下声明:

  

接收器的日期样式。

var dateStyle: DateFormatter.Style { get set }

同样,DateFormatter dateStyle属性具有以下声明:

  

接收器的时间风格。

var timeStyle: DateFormatter.Style { get set }

请注意,DateFormatter.Style是包含以下案例的枚举:noneshortmediumlongfull

另请注意,timeStyle仅在您为dateStyle个实例设置timeStyle和/或DateFormatter时才有效。

以下操场代码显示如何使用DateFormatter dateStyletimeStyle属性以所需格式显示日期。

import Foundation

let now = Date() // 2017-03-12 14:53:34 +0000
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! // 2017-03-11 14:53:34 +0000
let aWeekAgo = Calendar.current.date(byAdding: .weekOfMonth, value: -1, to: now)! // 2017-03-05 14:53:34 +0000

let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .short
dateFormatter.doesRelativeDateFormatting = true

let nowString = dateFormatter.string(from: now)
print(nowString) // prints: Today at 3:53 PM

let yesterdayString = dateFormatter.string(from: yesterday)
print(yesterdayString) // prints: Yesterday at 3:53 PM

let aWeekAgoString = dateFormatter.string(from: aWeekAgo)
print(aWeekAgoString) // prints: March 5, 2017 at 3:53 PM

答案 2 :(得分:6)

试一试

let dateFormatter = NSDateFormatter()
dateFormatter.dateStyle = .ShortStyle
dateFormatter.timeStyle = .ShortStyle
dateFormatter.doesRelativeDateFormatting = true

let date = NSDate()
let dateString = dateFormatter.stringFromDate(date)