2017-03-24 4 views
0

Ich möchte eine Tupel-Liste von Zeiten wie so erstellen; jede Stunde gehen von 0 bis 23.Erstellen Sie eine Liste von Zeitintervall Swift 3

tuple = [(2017-03-24 00:00:00 +0000, 0.0), (2017-03-24 00:01:00 +0000, 0.0), (2017-03-24 00:02:00 +0000, 0.0), (2017-03-24 00:03:00 +0000, 0.0)] 

Ich habe versucht, diesen Code zu verwenden, die mir die Stunden und Minuten geben, aber ich kann nicht scheinen, um herauszufinden, wie der aktuelle Monat, Tag und Jahr, um entweder mehr. Oder passen Sie das Datumsformat im Struct an.

Vielen Dank für Ihre Hilfe. Hier ist das Struct, das ich benutze ...

import Foundation 

struct TimeDay { 

let start: TimeInterval 
let end: TimeInterval 
let interval: TimeInterval 

init(start: TimeInterval, interval: TimeInterval, end: TimeInterval) { 
    self.start = start 
    self.interval = interval 
    self.end = end 
} 

init(startHour: TimeInterval, intervalMinutes: TimeInterval, endHour: TimeInterval) { 
    self.start = startHour * 60 * 60 
    self.end = endHour * 60 * 60 
    self.interval = intervalMinutes * 60 
} 

var timeRepresentations: [String] { 
    let dateComponentFormatter = DateComponentsFormatter() 
    dateComponentFormatter.unitsStyle = .positional 
    dateComponentFormatter.allowedUnits = [.minute, .hour] 

    let dateComponent = NSDateComponents() 
    return timeIntervals.map { timeInterval in 
     dateComponent.second = Int(timeInterval) 
     return dateComponentFormatter.string(from: dateComponent as DateComponents)! 
    } 
} 

var timeIntervals: [TimeInterval]{ 
    return Array(stride(from: start, through: end, by: interval)) 
} 
} 

Antwort

1

Ein Monat kann zwischen 28 bis 31 Tage haben. Sie können es nicht in eine genaue Anzahl von Sekunden konvertieren. Verwenden Sie DateComponents Ihr Schritt zu speichern:

struct TimeDay { 
    var startDate: Date 
    var endDate: Date 
    var step: DateComponents 

    var calendar = Calendar.autoupdatingCurrent 
    var dateFormatter: DateFormatter = { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     return formatter 
    }() 

    init(startDate: Date, endDate: Date, step: DateComponents) { 
     self.startDate = startDate 
     self.endDate = endDate 
     self.step  = step 
    } 

    var timeIntervals : [Date] { 
     guard self.startDate <= self.endDate else { 
      return [] 
     } 

     var result = [self.startDate] 
     var date = self.startDate 
     while date < self.endDate { 
      date = self.calendar.date(byAdding: step, to: date)! 
      result.append(date) 
     } 

     return result 
    } 

    var timeRepresentation : [String] { 
     return self.timeIntervals.map { self.dateFormatter.string(from: $0) } 
    } 
} 

Beispiel 1: Iterierte von Stunde

let startDate1 = DateComponents(calendar: .current, year: 2017, month: 3, day: 24).date! 
let endDate1 = DateComponents(calendar: .current, year: 2017, month: 3, day: 25).date! 

let t1 = TimeDay(startDate: startDate1, endDate: endDate1, step: DateComponents(hour: 1)) 
print(t1.timeRepresentation) 

Beispiel 2: Iterierte Monat

// Iterate by month 
let startDate2 = DateComponents(calendar: .current, year: 2017, month: 1, day: 1).date! 
let endDate2 = DateComponents(calendar: .current, year: 2017, month: 12, day: 31).date! 

let t2 = TimeDay(startDate: startDate2, endDate: endDate2, step: DateComponents(month: 1)) 
print(t2.timeRepresentation) 

Exa mple 3: Sie können auch die Zeiteinheiten mischen und iterieren von 1 Monat und 5 Tage:

let t3 = TimeDay(startDate: startDate2, endDate: endDate2, step: DateComponents(month: 1, day: 5)) 
print(t3.timeRepresentation) 

Edit:

Wenn Sie die nächste Stunde finden möchten: (1) Vorwärts zur nächsten Stunde; (2) zurück zur letzten Stunde gehen; (3) Wählen Sie diejenige aus, die dem angegebenen Datum am nächsten kommt

let date = Date()  
let closestHour = ([.backward, .forward] as [Calendar.SearchDirection]) 
    .flatMap { Calendar.current.nextDate(after: date, matching: DateComponents(minute: 0), matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: $0) } 
    .min { abs($0.timeIntervalSince(date)) < abs($1.timeIntervalSince(date)) } 
+0

Es funktioniert perfekt für das, was ich wollte, und ich habe herausgefunden, wie man das aktuelle Datum verwendet und dann 24 Stunden zurück. Nun, was ich brauche, ist von einem Array zu einem Tupel wie [(date: String, betrag: Double)] zu gelangen ... ... Außerdem wird jeder Wert im Tupel 0.0 sein, um zu starten. – Denis

0

Sie meinen sowas?

struct TimeDay { 
    let start: TimeInterval 
    let end: TimeInterval 
    let interval:TimeInterval 
    let fmt = DateFormatter() 

    init(start: TimeInterval, interval: TimeInterval, end: TimeInterval) { 
     self.start = start 
     self.interval = interval 
     self.end = end 
    } 

    init(startHour: TimeInterval, intervalMinutes: TimeInterval, endHour: TimeInterval) { 
     self.start = startHour * 60 * 60 
     self.end = endHour * 60 * 60 
     self.interval = intervalMinutes * 60 
    } 

    var timeRepresentations: [String] { 
     fmt.dateFormat = "yyyy-MM-dd HH:mm:ss z" 
     var dateComponent = DateComponents() 
     guard let calendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian) else { 
      return [] 
     } 
     dateComponent = calendar.components(in: TimeZone.current, from:Date()) 
     dateComponent.hour = 0 
     dateComponent.minute = 0 
     return timeIntervals.map { timeInterval in 
      dateComponent.second = Int(timeInterval) 
      let dt = calendar.date(from:dateComponent) 
      return fmt.string(from:dt!) 
     } 
    } 

    var timeIntervals: [TimeInterval]{ 
     return Array(stride(from: start, through: end, by: interval)) 
    } 
} 

Möglicherweise müssen die dateFormat für die DateFormatter zwicken die genaue Ausgabe, die Sie wollen, aber dies sollte funktionieren meistens so, wie Sie wollten.

Verwandte Themen