web-dev-qa-db-ja.com

「今日のxx:xx pm」、「昨日のxx:xx am」などの人間の言語で日付を表示するにはどうすればよいですか?

日付は「2014-07-0220:57:38 +0000」で、「今日の午後8時57分」にフォーマットしたいと思います。文字列が昨日の場合は、「昨日の午前9時」と表示したいと思います。今日でも昨日でもない場合は、「27/6 at7:53pm」のように実際の日付を表示してください。

以下のコードで「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で「今日」または「昨日」を表示するにはどうすればよいですか?

18
Henry Ngan

空白の理由は、日付形式には時間コンポーネントしかないためです。と組み合わせ .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"
34
Nate Cook

Swift 5.1、Apple Developer API Referenceは、DateFormatterの-​​ dateFormat プロパティについて述べています:

固定形式の日付表現の操作 で説明されているように、固定形式の表現を操作する場合にのみ、このプロパティを設定する必要があります。ユーザーに表示される表現の場合は、 dateStyle および timeStyle プロパティを使用するか、目的の形式を使用できない場合は setLocalizedDateFormatFromTemplate(_:) メソッドを使用する必要があります。事前定義されたスタイルを使用して実現。これらのプロパティとこのメソッドはどちらも、ユーザーへの表示に適したローカライズされた日付表現を提供します。


次のPlaygroundサンプルコードは、 dateStyletimeStyle 、および 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
12
Imanou Petit

これを試してみてください

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

let date = NSDate()
let dateString = dateFormatter.stringFromDate(date)
6
James Kuang