[解決済み] Swift - タイムスタンプが昨日、今日、明日、X日前であるかどうかをチェックする
質問
与えられたタイムスタンプが今日発生したか、それとも +1 / -1 日発生したかを決定する方法を見つけ出そうとしています。基本的に、私は次のようなことをしたいと思います(疑似コード)。
IF days_from_today(timestamp) == -1 RETURN 'Yesterday'
ELSE IF days_from_today(timestamp) == 0 RETURN 'Today'
ELSE IF days_from_today(timestamp) == 1 RETURN 'Tomorrow'
ELSE IF days_from_today(timestamp) < 1 RETURN days_from_today(timestamp) + ' days ago'
ELSE RETURN 'In ' + days_from_today(timestamp) + ' ago'
しかし、重要なのは、それがSwiftである必要があり、私はNSDate / NSCalendarオブジェクトと格闘していることです。まずはこんな感じで時差を計算するところから始めました。
let calendar = NSCalendar.currentCalendar()
let date = NSDate(timeIntervalSince1970: Double(timestamp))
let timeDifference = calendar.components([.Second,.Minute,.Day,.Hour],
fromDate: date, toDate: NSDate(), options: NSCalendarOptions())
しかし、この方法で比較するのは簡単ではありません。
.Day
は時間帯とタイムスタンプによって異なるからです。PHP では、mktime を使って、一日の始まりに基づいた新しい日付を作成するだけです (つまり
mktime(0,0,0)
) ですが、Swiftでそれを行う最も簡単な方法はわかりません。
誰か、これにアプローチする方法について良いアイデアを持っていますか?おそらく、NSDate または同様の何かの拡張が最善でしょうか?
どのように解決するのですか?
Calendar
には、3つのケースに対応するメソッドがあります。
func isDateInYesterday(_ date: Date) -> Bool
func isDateInToday(_ date: Date) -> Bool
func isDateInTomorrow(_ date: Date) -> Bool
昨日より前の日数を計算する場合は
func dateComponents(_ components: Set<Calendar.Component>,
from start: Date,
to end: Date) -> DateComponents
パス
[.day]
を
components
を取得し
day
プロパティを取得します。
も考慮した関数です。
is in
を考慮する機能です(Swift 3以上)。
func dayDifference(from interval : TimeInterval) -> String
{
let calendar = Calendar.current
let date = Date(timeIntervalSince1970: interval)
if calendar.isDateInYesterday(date) { return "Yesterday" }
else if calendar.isDateInToday(date) { return "Today" }
else if calendar.isDateInTomorrow(date) { return "Tomorrow" }
else {
let startOfNow = calendar.startOfDay(for: Date())
let startOfTimeStamp = calendar.startOfDay(for: date)
let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)
let day = components.day!
if day < 1 { return "\(-day) days ago" }
else { return "In \(day) days" }
}
}
別の方法として
DateFormatter
を使うこともできます。
昨日
,
今日
と
明日
をクリックすると、ローカライズされた文字列を無料で取得できます。
func dayDifference(from interval : TimeInterval) -> String
{
let calendar = Calendar.current
let date = Date(timeIntervalSince1970: interval)
let startOfNow = calendar.startOfDay(for: Date())
let startOfTimeStamp = calendar.startOfDay(for: date)
let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)
let day = components.day!
if abs(day) < 2 {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .none
formatter.doesRelativeDateFormatting = true
return formatter.string(from: date)
} else if day > 1 {
return "In \(day) days"
} else {
return "\(-day) days ago"
}
}
更新します。
macOS 10.15 / iOS 13 では
RelativeDateTimeFormatter
は、特定の日付からの相対的な(ローカライズされた)文字列を返すために導入されました。
関連
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] iOSのステータスバーの文字色を変更する方法
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITextViewのサイズをコンテンツに合わせるには?
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] 16進カラーバリューの使用方法
-
[解決済み] iOSアプリをApple Developer Programや脱獄せずにデバイス上でテストすることができます。
-
[解決済み] iPhoneでナビゲーションバーを1ページ目だけ非表示にする
-
[解決済み] ぼかしの入ったオーバーレイビューの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] UIViewの左上と右上だけにcornerRadiusを設定する方法は?
-
[解決済み] 「GCC使用時に「Xcode/iOSのライセンスに同意するには管理者権限が必要です。rootでsudoを使用して再実行してください。
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] Swiftで配列に要素を追加する
-
[解決済み] 2つのNSDates間のスウィフト日数