tipo from fechas current create comparar swift date-comparison

from - swift date operations



Diferencia entre 2 fechas en semanas y días usando swift 3 y xcode 8 (3)

Estoy tratando de calcular la diferencia entre 2 fechas (una es la fecha actual y la otra de datepicker) en semanas y días y luego muestro el resultado en una etiqueta, eso es lo que he hecho hasta ahora, aprecio la ayuda de desarrolladores más experimentados ¡aquí!

let EDD = datePicker.date let now = NSDate() let formatter = DateComponentsFormatter() formatter.unitsStyle = .short formatter.allowedUnits = [.day] formatter.maximumUnitCount = 2 let string = formatter.string (from: now as Date, to: EDD) label.text = string


Swift 4

Pruebas usando Xcode Versión 9.2

  • Combinando las dos respuestas anteriores que me ayudan.

Utilice el siguiente método para obtener la cadena por la diferencia entre dos fechas; la idea es localizar las palabras semanas / días / minutos según el formato.

func getTimeComponentString(olderDate older: Date,newerDate newer: Date) -> (String?) { let formatter = DateComponentsFormatter() formatter.unitsStyle = .full let componentsLeftTime = Calendar.current.dateComponents([.minute , .hour , .day,.month, .weekOfMonth,.year], from: older, to: newer) let year = componentsLeftTime.year ?? 0 if year > 0 { formatter.allowedUnits = [.year] return formatter.string(from: older, to: newer) } let month = componentsLeftTime.month ?? 0 if month > 0 { formatter.allowedUnits = [.month] return formatter.string(from: older, to: newer) } let weekOfMonth = componentsLeftTime.weekOfMonth ?? 0 if weekOfMonth > 0 { formatter.allowedUnits = [.weekOfMonth] return formatter.string(from: older, to: newer) } let day = componentsLeftTime.day ?? 0 if day > 0 { formatter.allowedUnits = [.day] return formatter.string(from: older, to: newer) } let hour = componentsLeftTime.hour ?? 0 if hour > 0 { formatter.allowedUnits = [.hour] return formatter.string(from: older, to: newer) } let minute = componentsLeftTime.minute ?? 0 if minute > 0 { formatter.allowedUnits = [.minute] return formatter.string(from: older, to: newer) ?? "" } return nil }

Aquí es cómo puedes usar

let nowDate = Date() let endDate = Date().addingTimeInterval(12345678) let string = String.getTimeComponentString(olderDate: nowDate, newerDate: endDate)! print(nowDate) print(endDate) print(string)

  • Salida

  • 2018-03-08 08:11:22 +0000
  • 2018-07-29 05:32:41 +0000
  • 4 meses

Estás cerca. Simplemente agregue .weekOfMonth (que significa "cantidad de semanas" según la documentación de la API) a las unidades permitidas. Ejemplo:

let now = Date() let endDate = now.addingTimeInterval(24 * 3600 * 17) let formatter = DateComponentsFormatter() formatter.allowedUnits = [.day, .weekOfMonth] formatter.unitsStyle = .full let string = formatter.string(from: now, to: endDate)! print(string) // 2 weeks, 3 days

maximumUnitCount = 2 es necesario establecer maximumUnitCount = 2 porque solo hay dos unidades permitidas.


Puede usar la fecha de los dateComponents(_:from:to:) del dateComponents(_:from:to:) para encontrar la diferencia entre 2 fechas para las unidades que desee.

Ejemplo:

let dateRangeStart = Date() let dateRangeEnd = Date().addingTimeInterval(12345678) let components = Calendar.current.dateComponents([.weekOfYear, .month], from: dateRangeStart, to: dateRangeEnd) print(dateRangeStart) print(dateRangeEnd) print("difference is /(components.month ?? 0) months and /(components.weekOfYear ?? 0) weeks") > 2017-02-17 10:05:19 +0000 > 2017-07-10 07:26:37 +0000 > difference is 4 months and 3 weeks let months = components.month ?? 0 let weeks = components.weekOfYear ?? 0