web-dev-qa-db-fra.com

Comment se rendre il y a 1 heure à partir d'une date dans iOS swift?

J'ai fait des recherches, mais je ne pouvais pas trouver de solution exacte à mon problème. J'ai essayé d'obtenir il y a 1 heure d'une date. Comment puis-je y arriver rapidement?

28
saksut

Pour des calculs corrects impliquant NSDate prenant en compte tous les cas Edge de différents calendriers (par exemple, passer d'une heure à l'autre), utilisez la classe NSCalendar

Swift 3+

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

Plus âgée

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

Utilisez cette méthode et collez-la dans votre classe d'assistance.

Mise à jour pour Swift 3 et XCode 8.3

  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"
    }

}

Utilisation de cette méthode:

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

Veuillez lire la référence de la classe NSDate.

let oneHourAgo = NSDate.dateWithTimeIntervalSinceNow(-3600)

devrait le faire.

Ou, pour tout objet NSDate:

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

Selon vos besoins, vous pouvez choisir l’une des 3 méthodes suivantes de Swift 3 pour obtenir une heure auparavant d’une instance Date.


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

Calendar a une méthode appelée date(byAdding:value:to:wrappingComponents:) . date(byAdding:value:to:wrappingComponents:) a la déclaration suivante:

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

Renvoie une nouvelle Date représentant la date calculée en ajoutant un montant d'un composant spécifique à une date donnée.

Le code de Playground ci-dessous montre comment l'utiliser:

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 a une méthode appelée date(byAdding:to:wrappingComponents:) . date(byAdding:value:to:wrappingComponents:) a la déclaration suivante:

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

Retourne une nouvelle Date représentant la date calculée en ajoutant des composants à une date donnée.

Le code de Playground ci-dessous montre comment l'utiliser:

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)

Alternative:

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(_:) (à utiliser avec prudence)

Date a une méthode appelée addingTimeInterval(_:) . addingTimeInterval(_:) a la déclaration suivante:

func addingTimeInterval(_ timeInterval: TimeInterval) -> Date

Renvoie une nouvelle Date en ajoutant une TimeInterval à cette Date.

Notez que cette méthode est accompagnée d'un avertissement:

Cela ajuste seulement une valeur absolue. Si vous souhaitez ajouter des concepts de calendrier tels que heures, jours, mois, vous devez utiliser une variable Calendar. Cela prendra en compte des complexités telles que l'heure d'été, les mois avec un nombre de jours différent, etc.

Le code de Playground ci-dessous montre comment l'utiliser:

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

Swift3:

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

Si vous utilisez NSDate vous pouvez faire:

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

L'objet date sera remplacé par "il y a 1 heure".

4
kbagi

Je réalise la fonctionnalité il y a longtemps en créant une extension de Date. Ce qui est donné ci-dessous:

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 ""
  }
}

Ensuite, j'obtiens le temps en calculant la différence entre la date du jour et la date spécifiée:

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

pour Swift 2:

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

comment utiliser:

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

Vous pouvez également utiliser un opérateur

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

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

0
coco