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)
'IT story' 카테고리의 다른 글
Pandas 또는 Numpy Nan을 None으로 대체하여 MysqlDB와 함께 사용 (0) | 2020.08.31 |
---|---|
id () 함수는 무엇에 사용됩니까? (0) | 2020.08.31 |
1이 아닌 2 열에서 중복을 찾는 방법 (0) | 2020.08.31 |
NetBeans에서 파일 인코딩을 변경하는 방법은 무엇입니까? (0) | 2020.08.31 |
문자열에서 n 번째 발생을 얻는 방법? (0) | 2020.08.31 |