programing

Swift를 사용하여 정수인 NSDates 간의 차이(초) 찾기

starjava 2023. 9. 9. 08:50
반응형

Swift를 사용하여 정수인 NSDates 간의 차이(초) 찾기

버튼을 누른 시간을 측정하고 싶은 코드를 작성하고 있습니다. 위해서 을을 했습니다.NSDate()을,을을때e때g을en,을고을sndd,dtimeIntervalSinceDate버튼을 해제했을 때의 기능.그건 될 것 같은데 결과를 출력하거나 정수로 바꿀 방법을 찾을 수가 없네요.

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 과 같습니다스위프트 3에서는 다음과 같습니다.

let elapsed = Date().timeIntervalSince(timeAtPress)

를 합니다.()e 이후에Date참조, 를 호출합니다.

또는 요즘은 (예: iOS 15+, macOS 12+) 기능을 사용하는 것을 선호할 수도 있는데, 이는 정확히 동일한 작업을 수행하지만 이름을 통해 기능적 의도를 명시합니다.

let elapsed = Date.now.timeIntervalSince(timeAtPress)

Date()/Date.init()/Date.now개체를 새를한음짜음한timeIntervalSince과의를다것 사이의 합니다.timeAtPress 값a. 으로는 됩니다 ( a))이 반환됩니다.TimeInterval).

이 을 로 로 이 을 Int value,을할수다다수을 사용하면 됩니다.

let duration = Int(elapsed)

몇 가지 대안이 있습니다.

  1. 요즘은 (iOS 16+, macOS 13+) a를 사용할 수도 있습니다.

    let clock = ContinuousClock()
    let start = clock.now
    
    // do something
    
    let elapsed = .now - start
    

    또는 작업에 소요되는 시간을 측정할 수 있습니다.

    // for async routines
    
    let elapsed = try await ContinuousClock().measure {
        // something asynchronous with `await`
    }
    
    // for synchronous routines
    
    let elapsed = ContinuousClock().measure {
        // something synchronous
    }
    

    이 시계들은 WWDC 2022 비디오 Meet Swift Async Algorithms에 약 6분간 소개됩니다.

  2. 때때로 우리는 단지 다음과 같이 경과된 시간(초)만을 원합니다.

    let start = CFAbsoluteTimeGetCurrent()
    
    // do something
    
    let elapsed = CFAbsoluteTimeGetCurrent() - start
    
  3. 이 문서는 다음과 같이 경고하고 있음을 유의할 필요가 있습니다.

    이 기능에 반복적으로 호출한다고 해서 단조롭게 증가하는 결과가 보장되는 것은 아닙니다.시스템 시간은 외부 시간 기준과 동기화되거나 클럭의 명시적인 사용자 변경으로 인해 감소할 수 있습니다.

    이는 이러한 조정 중 하나를 수행할 때 경과 시간을 측정할 수 없을 정도로 불행한 경우 잘못된 경과 시간 계산으로 끝날 수 있음을 의미합니다.에 해당됩니다.NSDate/Date계산도 그렇고요.A를 사용하는 것이 가장 안전합니다.mach_absolute_time기반 계산(가장 쉽게 사용):

    let start = CACurrentMediaTime()
    
    // do something
    
    let elapsed = CACurrentMediaTime() - start
    

    사용합니다.mach_absolute_time, 그러나 기술 Q&A QA1398에 설명된 복잡성의 일부는 피합니다.

    하지만, 기억하세요.CACurrentMediaTime/mach_absolute_time디바이스가 재부팅되면 재설정됩니다.따라서 앱이 실행되는 동안 정확한 경과 시간 계산이 필요하다면 다음을 사용합니다.CACurrentMediaTime. 하지만 이 시작 시간을 나중에 앱을 다시 시작할 때 기억할 수 있는 영구 저장소에 저장하려면 다음을 사용해야 합니다.Date아니면CFAbsoluteTimeGetCurrent, 그리고 혹시라도 있을 법한 부정확함을 감수하고 살아가세요.

스위프트 5

let differenceInSeconds = Int(endDate.timeIntervalSince(startDate))

NSDate()와 NSCalendar()는 좋은 선택인 것 같습니다.달력 계산을 사용하고 실제 연산 부분은 프레임워크에 맡깁니다.다음은 2개 사이의 초를 얻는 간단한 예입니다.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)")

프레디의 대답에 따르면 스위프트 3의 기능은 다음과 같습니다.

let start = Date()
let end = Date(timeIntervalSince1970: 100)
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponents = calendar.dateComponents(unitFlags, from: start, to: end)
let seconds = datecomponents.second
print(String(describing: seconds))

이것이 스위프트 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

참조:두 NSD 날짜 간의 차이(개월/일/시간/분/초) 가져오기

"hh:mm"에서 2시간 사이의 스위프트 3초의 경우

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

}

사용.

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

반응형