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

Hen*_*gan 17 nsdate nsdateformatter ios swift

我有一个日期"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
Run Code Online (Sandbox Code Playgroud)

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

            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)
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ook 30

它是空白的原因是您的日期格式只有时间组件.结合使用.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"
Run Code Online (Sandbox Code Playgroud)

  • 其实你只需要一个.你可以这样做:var formatter:NSDateFormatter = NSDateFormatter()formatter.dateStyle = NSDateFormatterStyle.ShortStyle formatter.timeStyle = NSDateFormatterStyle.ShortStyle formatter.doesRelativeDateFormatting = true var dateString = formatter.stringFromDate(NSDate()) (3认同)

Ima*_*tit 11

使用Swift 3,Apple Developer API Reference声明了有关DateFormatterdateFormat属性:

只有在使用固定格式表示时才应设置此属性,如使用固定格式日期表示中所述.对于用户可见的表示,如果使用预定义的样式无法实现所需的格式,则应使用dateStyletimeStyle属性,或setLocalizedDateFormatFromTemplate(_ :)方法; 这两个属性和此方法都提供了适合显示给用户的本地化日期表示.


doesRelativeDateFormatting DateFormatter 财产有以下声明:

接收器的日期样式.

import Foundation

let now = Date() // 2019-08-09 12:25:12 +0000
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! // 2019-08-08 12:25:12 +0000
let aWeekAgo = Calendar.current.date(byAdding: .weekOfMonth, value: -1, to: now)! // 2019-08-02 12:25:12 +0000

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

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

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

let aWeekAgoString = dateFormatter.string(from: aWeekAgo)
print(aWeekAgoString) // prints: August 2, 2019 at 2:25 PM
Run Code Online (Sandbox Code Playgroud)

同样,dateFormat doesRelativeDateFormatting财产有以下声明:

接收器的时间风格.

import Foundation

let now = Date() // 2019-08-09 12:25:12 +0000
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! // 2019-08-08 12:25:12 +0000
let aWeekAgo = Calendar.current.date(byAdding: .weekOfMonth, value: -1, to: now)! // 2019-08-02 12:25:12 +0000

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

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

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

let aWeekAgoString = dateFormatter.string(from: aWeekAgo)
print(aWeekAgoString) // prints: August 2, 2019 at 2:25 PM
Run Code Online (Sandbox Code Playgroud)

请注意,DateFormatter与以下情况的枚举:dateFormat,doesRelativeDateFormatting,DateFormatter,dateFormat,doesRelativeDateFormatting.

另请注意,DateFormatter仅在设置dateFormat和/或doesRelativeDateFormatting为您的DateFormatter实例时有效.


以下Playground代码显示如何使用dateFormat doesRelativeDateFormattingDateFormatter属性以所需格式显示日期.

import Foundation

let now = Date() // 2019-08-09 12:25:12 +0000
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)! // 2019-08-08 12:25:12 +0000
let aWeekAgo = Calendar.current.date(byAdding: .weekOfMonth, value: -1, to: now)! // 2019-08-02 12:25:12 +0000

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

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

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

let aWeekAgoString = dateFormatter.string(from: aWeekAgo)
print(aWeekAgoString) // prints: August 2, 2019 at 2:25 PM
Run Code Online (Sandbox Code Playgroud)


Jam*_*ang 6

试一试

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

let date = NSDate()
let dateString = dateFormatter.stringFromDate(date)
Run Code Online (Sandbox Code Playgroud)