IT story

Swift를 사용하여 NSDates를 정수로 초 단위로 찾기

hot-time 2020. 8. 31. 08:24
반응형

Swift를 사용하여 NSDates를 정수로 초 단위로 찾기


버튼을 누르고있는 시간을 측정하고 싶은 코드를 작성하고 있습니다. 이를 위해 NSDate()버튼을 눌렀을 때를 기록 timeIntervalSinceDate하고 버튼을 놓을 때 기능을 사용해 보았습니다 . 작동하는 것 같지만 결과를 인쇄하거나 정수로 전환하는 방법을 찾을 수 없습니다.

var timeAtPress = NSDate() 

@IBAction func pressed(sender: AnyObject) {
    println("pressed")
    timeAtPress = NSDate()
}

@IBAction func released(sender: AnyObject) {
    println("released")
    var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
    duration = ???
}

비슷한 질문을 몇 개 보았지만 C를 몰라 주어진 답을 이해하는 데 어려움을 겪었습니다. 버튼을 누르고있는 시간을 더 효율적으로 확인할 수있는 방법이 있다면 제안을받을 수 있습니다. 미리 감사드립니다.


계산하려는 시도 elapsedTime가 잘못되었습니다. Swift 3에서는 다음과 같습니다.

let elapsed = Date().timeIntervalSince(timeAtPress)

참조 ()유의하십시오 Date. Date()새 날짜 객체를 인스턴스화 한 다음 timeIntervalSince그 사이의 시간 차이를 반환합니다 timeAtPress. 그러면 부동 소수점 값 (기술적으로는 a TimeInterval) 이 반환됩니다 .

Int으로 자르려면 다음을 사용할 수 있습니다.

let duration = Int(elapsed)

그리고 BTW, timeAtPress변수 의 정의 Date개체 를 인스턴스화 할 필요가 없습니다 . 나는 당신이 의도했다고 생각합니다 :

var timeAtPress: Date!

그것은 변수를 Date변수 (암묵적으로 풀린 것)로 정의하지만, 아마도 pressed호출 될 때까지 그 변수의 실제 인스턴스화를 연기 할 것 입니다.


또는 자주 사용합니다 CFAbsoluteTimeGetCurrent().

var start: CFAbsoluteTime!

을 설정 startTime하려면 다음을 수행합니다.

start = CFAbsoluteTimeGetCurrent()

그리고 경과 한 시간 (초)을 계산하려면 다음을 수행합니다.

let elapsed = CFAbsoluteTimeGetCurrent() - start

CFAbsoluteTimeGetCurrent문서가 다음과 같이 경고 한다는 점은 주목할 가치가 있습니다 .

이 함수에 대한 반복 호출은 단조롭게 증가하는 결과를 보장하지 않습니다. 시스템 시간은 외부 시간 참조와의 동기화 또는 사용자의 명시적인 시계 변경으로 인해 감소 할 수 있습니다.

즉, 이러한 조정 중 하나가 발생할 때 경과 시간을 측정 할만큼 불행한 경우 경과 시간 계산이 잘못 될 수 있습니다. 이것은 마찬가지입니다 NSDate/ Date너무 계산. mach_absolute_time기반 계산 을 사용하는 것이 가장 안전합니다 (가장 쉽게 수행 할 수 있음 CACurrentMediaTime).

let start = CACurrentMediaTime()

let elapsed = CACurrentMediaTime() - start

이것은 사용 mach_absolute_time하지만 기술 Q & A QA1398에 설명 된 복잡성 중 일부를 피 합니다.

그러나 장치가 재부팅되면 CACurrentMediaTime/ mach_absolute_time가 재설정됩니다. 따라서 결론적으로 앱이 실행되는 동안 정확한 경과 시간 계산이 필요한 경우 CACurrentMediaTime. 앱이 미래의 어느 날짜에 다시 시작할 때 불러 수있는 영구 저장소에서이 시작 시간을 절약 할 거라면, 그때 당신은 사용해야 Date하거나 CFAbsoluteTimeGetCurrent, 및 수반 할 수있다 부정확 그냥 살고 있습니다.


NSDate () 및 NSCalendar ()는 좋은 선택처럼 들립니다. 달력 계산을 사용하고 실제 수학 부분은 프레임 워크에 맡깁니다. 다음은 두 시간 사이의 초를 얻는 간단한 예입니다.NSDate()

let startDate = NSDate()
let endDate = NSDate()
let calendar = NSCalendar.currentCalendar()
let dateComponents = calendar.components(NSCalendarUnit.CalendarUnitSecond, fromDate: startDate, toDate: endDate, options: nil)
let seconds = dateComponents.second
println("Seconds: \(seconds)")

Freddy의 답변에 따르면 이것은 swift 3의 기능입니다.

let start = Date()
        let enddt = Date(timeIntervalSince1970: 100)
        let calendar = Calendar.current
        let unitFlags = Set<Calendar.Component>([ .second])
        let datecomponenets = calendar.dateComponents(unitFlags, from: start, to: enddt)
        let seconds = datecomponenets.second
        print("Seconds: \(seconds)")

스위프트 5

    let startDate = Date()
    let endDate = Date()
    let calendar = Calendar.current
    let dateComponents = calendar.compare(startDate, to: endDate, toGranularity: .second)
    let seconds = dateComponents.rawValue
    print("Seconds: \(seconds)")

이것이 최신 버전의 Swift 3에서 차이를 얻을 수있는 방법입니다.

let calendar = NSCalendar.current
var compos:Set<Calendar.Component> = Set<Calendar.Component>()
compos.insert(.second)
compos.insert(.minute)
let difference = calendar.dateComponents(compos, from: fromDate, to: toDate)
print("diff in minute=\(difference.minute!)") // difference in minute
print("diff in seconds=\(difference.second!)") // difference in seconds

Reference: Getting the difference between two NSDates in (months/days/hours/minutes/seconds)


For Swift 3 Seconds between 2 time in "hh:mm"

func secondsIn(_ str: String)->Int{
    var strArr = str.characters.split{$0 == ":"}.map(String.init)
    var sec = Int(strArr[0])! * 3600
    var sec1 = Int(strArr[1])! * 36
    print("sec")
    print(sec+sec1)
    return sec+sec1

}

Usage

var sec1 = secondsIn(shuttleTime)
var sec2 = secondsIn(dateToString(Date()))
print(sec1-sec2)

참고URL : https://stackoverflow.com/questions/26599172/find-difference-in-seconds-between-nsdates-as-integer-using-swift

반응형