web-dev-qa-db-ja.com

iOSの迅速な日付から1時間前に取得する方法は?

私は調査を行ってきましたが、問題の正確な解決策を見つけることができませんでした。日付から1時間前に取得しようとしています。どうすればこれを迅速に達成できますか?

33
saksut

NSCalendarクラスを使用して、異なるカレンダーのすべてのEdgeケースを考慮したNSDateを含む正しい計算(たとえば、日節約時間の切り替え)を行う必要があります。

Swift 3 +

let earlyDate = Calendar.current.date(
  byAdding: .hour, 
  value: -1, 
  to: Date())

// Get the date that was 1hr before now
let earlyDate = NSCalendar.currentCalendar().dateByAddingUnit(
       .Hour,
       value: -1, 
       toDate: NSDate(),
       options: [])
52
Vladimir

このメソッドを使用して、ヘルパークラスに貼り付けます。

Swift 3およびXCode 8.の更新

  class func timeAgoSinceDate(_ date:Date,currentDate:Date, numericDates:Bool) -> String {
    let calendar = Calendar.current
    let now = currentDate
    let earliest = (now as NSDate).earlierDate(date)
    let latest = (earliest == now) ? date : now
    let components:DateComponents = (calendar as NSCalendar).components([NSCalendar.Unit.minute , NSCalendar.Unit.hour , NSCalendar.Unit.day , NSCalendar.Unit.weekOfYear , NSCalendar.Unit.month , NSCalendar.Unit.year , NSCalendar.Unit.second], from: earliest, to: latest, options: NSCalendar.Options())

    if (components.year! >= 2) {
        return "\(components.year!) years ago"
    } else if (components.year! >= 1){
        if (numericDates){
            return "1 year ago"
        } else {
            return "Last year"
        }
    } else if (components.month! >= 2) {
        return "\(components.month!) months ago"
    } else if (components.month! >= 1){
        if (numericDates){
            return "1 month ago"
        } else {
            return "Last month"
        }
    } else if (components.weekOfYear! >= 2) {
        return "\(components.weekOfYear!) weeks ago"
    } else if (components.weekOfYear! >= 1){
        if (numericDates){
            return "1 week ago"
        } else {
            return "Last week"
        }
    } else if (components.day! >= 2) {
        return "\(components.day!) days ago"
    } else if (components.day! >= 1){
        if (numericDates){
            return "1 day ago"
        } else {
            return "Yesterday"
        }
    } else if (components.hour! >= 2) {
        return "\(components.hour!) hours ago"
    } else if (components.hour! >= 1){
        if (numericDates){
            return "1 hour ago"
        } else {
            return "An hour ago"
        }
    } else if (components.minute! >= 2) {
        return "\(components.minute!) minutes ago"
    } else if (components.minute! >= 1){
        if (numericDates){
            return "1 minute ago"
        } else {
            return "A minute ago"
        }
    } else if (components.second! >= 3) {
        return "\(components.second!) seconds ago"
    } else {
        return "Just now"
    }

}

このメソッドの使用:

var timeAgo:String=AppHelper.timeAgoSinceDate(date, numericDates: true)
Print("\(timeAgo)")   // Ex- 1 hour ago
34
Sourabh Sharma

NSDateクラス参照を読んでください。

let oneHourAgo = NSDate.dateWithTimeIntervalSinceNow(-3600)

それを行う必要があります。

または、NSDateオブジェクトの場合:

let oneHourBack = myDate.dateByAddingTimeInterval(-3600)
10
zisoft

必要に応じて、3つの次のSwift 5メソッドのいずれかを選択して、Dateインスタンスから1時間前に取得できます。


1. date(byAdding:value:to:wrappingComponents:)

Calendarには date(byAdding:value:to:wrappingComponents:) というメソッドがあります。 date(byAdding:value:to:wrappingComponents:)には次の宣言があります。

_func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?
_

特定のコンポーネントの量を特定の日付に追加することによって計算された日付を表す新しいDateを返します。

以下のPlaygroundコードは、その使用方法を示しています。

_import Foundation

let now = Date()
let oneHourAgo = Calendar.current.date(byAdding: .hour, value: -1, to: now)

print(now) // 2016-12-19 21:52:04 +0000
print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
_

2. date(byAdding:to:wrappingComponents:)

Calendarには date(byAdding:to:wrappingComponents:) というメソッドがあります。 date(byAdding:value:to:wrappingComponents:)には次の宣言があります。

_func date(byAdding components: DateComponents, to date: Date, wrappingComponents: Bool = default) -> Date?
_

指定された日付にコンポーネントを追加して計算された日付を表す新しいDateを返します。

以下のPlaygroundコードは、その使用方法を示しています。

_import Foundation

let now = Date()

var components = DateComponents()
components.hour = -1
let oneHourAgo = Calendar.current.date(byAdding: components, to: now)

print(now) // 2016-12-19 21:52:04 +0000
print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
_

代替案:

_import Foundation

// Get the date that was 1hr before now
let now = Date()

let components = DateComponents(hour: -1)
let oneHourAgo = Calendar.current.date(byAdding: components, to: now)

print(now) // 2016-12-19 21:52:04 +0000
print(String(describing: oneHourAgo)) // Optional(2016-12-19 20:52:04 +0000)
_

3. addingTimeInterval(_:)(注意して使用)

Dateには addingTimeInterval(_:) というメソッドがあります。 addingTimeInterval(_:)には次の宣言があります。

_func addingTimeInterval(_ timeInterval: TimeInterval) -> Date
_

このDateTimeIntervalを追加して、新しいDateを返します。

このメソッドには警告が付いていることに注意してください。

これは絶対値のみを調整します。時間、日、月などの暦の概念を追加する場合は、Calendarを使用する必要があります。これには、夏時間、日数の異なる月などの複雑さが考慮されます。

以下のPlaygroundコードは、その使用方法を示しています。

_import Foundation

let now = Date()
let oneHourAgo = now.addingTimeInterval(-3600)

print(now) // 2016-12-19 21:52:04 +0000
print(oneHourAgo) // 2016-12-19 20:52:04 +0000
_
7
Imanou Petit

NSDateを使用している場合、次のことができます。

let date = NSDate()
date.dateByAddingTimeInterval(-3600)

dateオブジェクトを「1時間前」に変更します。

5
kbagi

Swift3:

let now = Date()
let tempCalendar = Calendar.current
let alteredDate = tempCalendar.date(byAdding: .hour, value: -1, to: now)
4
Chris Allinson

Dateの拡張機能を作成することにより、以前の機能を実現します。以下に示します:

extension Date {
 // Returns the number of years 
 func yearsCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
 }
 // Returns the number of months
 func monthsCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
 }
 // Returns the number of weeks
 func weeksCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
 }
 // Returns the number of days
 func daysCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
 }
 // Returns the number of hours
 func hoursCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
 }
 // Returns the number of minutes
func minutesCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
 }
 // Returns the number of seconds
 func secondsCount(from date: Date) -> Int {
    return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
 }
 // Returns time ago by checking if the time differences between two dates are in year or months or weeks or days or hours or minutes or seconds
 func timeAgo(from date: Date) -> String {
    if yearsCount(from: date)   > 0 { return "\(yearsCount(from: date))years ago"   }
    if monthsCount(from: date)  > 0 { return "\(monthsCount(from: date))months ago"  }
    if weeksCount(from: date)   > 0 { return "\(weeksCount(from: date))weeks ago"   }
    if daysCount(from: date)    > 0 { return "\(daysCount(from: date))days ago"    }
    if hoursCount(from: date)   > 0 { return "\(hoursCount(from: date))hours ago"   }
    if minutesCount(from: date) > 0 { return "\(minutesCount(from: date))minutes ago" }
    if secondsCount(from: date) > 0 { return "\(secondsCount(from: date))seconds ago" }
    return ""
  }
}

次に、現在の日付と指定された日付の差を計算することにより、時間前を取得します:

   let timeAgo = Date().timeAgo(from: sender.date)
2
H S Progr

for Swift 2:

extension NSDate {
    func after(value: Int, calendarUnit:NSCalendarUnit) -> NSDate {
        return calendar.dateByAddingUnit(calendarUnit, value: value, toDate: self, options: [])!
    }
}

使い方:

let lastHour = NSDate().after(-1, calendarUnit: .Hour)
1
Deepak Sharma

演算子を使用することもできます

let date = Date()
let anHourAgo = date - TimeInterval(3600.0)

Apple Docs: https://developer.Apple.com/documentation/foundation/date/2293436

0
coco