2017-03-24 5 views
0

이렇게 시간의 튜플 목록을 만들고 싶습니다. 0에서 나는 나에게 시간과 분을 줄 것이다이 코드를 사용하는 것을 시도했다 (23)시간 간격 스위프트 목록 만들기 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)] 

에가는 모든 시간, 그러나 나는 현재의 월, 일 및 연도를 추가하거나 방법을 알아낼 수없는 것. 또는 구조에서 날짜 형식을 조정하십시오.

도움 주셔서 감사합니다. 여기에 내가 사용하고있는 구조체가 있습니다 ...

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

답변

1

월은 28 일에서 31 일 사이 일 수 있습니다. 정확한 초 수로 변환 할 수 없습니다. 당신의 단계 저장 DateComponents를 사용

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

예 1 : 시간에 의해으로 반복

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) 

예 2 : 월별로으로 반복

// 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 : 당신은 또한 시간 단위를 섞어 1 개월 5 일까지 반복 할 수

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

편집 :

당신이 가까운 시간을 찾으려면 : (1) 앞으로 다음 시간으로 이동; (2) 마지막 시간으로 뒤로 이동; (3) 지정된 날짜에 가장 가까운 것을 선택하십시오.

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

그것은 내가 원한 것을 위해 완벽하게 작동하고, 현재 날짜를 사용한 다음 24 시간 후에 다시 사용하는 방법을 알아 냈습니다. 이제 내가 필요한 것은 배열에서 [(date : String, amount : Double)] ...와 같은 튜플을 얻는 것입니다. 또한 튜플의 모든 값은 0.0으로 시작합니다. – Denis

0

이런 뜻입니까?

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

당신은 당신이 원하는 정확한 결과를 얻을 수있는 DateFormatter에 대한 dateFormat 조정할해야 할 수도 있습니다, 그러나 이것은 당신이 원하는 대부분의 방법을 작동합니다.