সুইফটটি ব্যবহার করে পূর্ণসংখ্যা হিসাবে এনএসডিটসের মধ্যে সেকেন্ডের মধ্যে পার্থক্য খুঁজুন


99

আমি একটি কোডের টুকরো লিখছি যেখানে আমি টাইম করতে চাই কতক্ষণ একটি বোতাম চেপে ধরেছিল। এটি করতে আমি 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 = ???
}

আমি কয়েকটি অনুরূপ প্রশ্ন দেখেছি, তবে আমি সি জানি না তাই প্রদত্ত উত্তরগুলি বুঝতে আমার খুব কষ্ট হয়েছিল। বোতামটি কতক্ষণ ধরে ছিল তা খুঁজে পাওয়ার আরও যদি কোনও কার্যকর উপায় থাকে তবে আমি পরামর্শের জন্য উন্মুক্ত। আগাম ধন্যবাদ.

উত্তর:


217

আপনার গণনা করার চেষ্টাটি elapsedTimeভুল। সুইফ্ট 3-তে, এটি হবে:

let elapsed = Date().timeIntervalSince(timeAtPress)

উল্লেখ্য ()পর Dateরেফারেন্স। Date()নতুন তারিখ বস্তুর instantiates, এবং তারপর timeIntervalSinceযে মধ্যে সময় পার্থক্য ফেরৎ timeAtPress। এটি একটি ভাসমান পয়েন্ট মান (প্রযুক্তিগতভাবে, ক TimeInterval) প্রদান করবে।

যদি আপনি এটি কোনও Intমান হিসাবে কাটা হিসাবে চান , আপনি কেবল ব্যবহার করতে পারেন:

let duration = Int(elapsed)

এবং, বিটিডাব্লু, আপনার চলকটির সংজ্ঞাটি 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, তবে প্রযুক্তিগত প্রশ্নোত্তর প্রশ্নোত্তর QA1398 এ বর্ণিত কিছু জটিলতা এড়িয়ে চলে ।

মনে রাখবেন, ডিভাইসটি পুনরায় বুট করার সময় সেই CACurrentMediaTime/ mach_absolute_timeপুনরায় সেট করা হবে। সুতরাং, বটম লাইন, যদি আপনি সঠিক ব্যায়িত সময় গণনার প্রয়োজন একটি অ্যাপ্লিকেশন ব্যবহার চলছে সময়, CACurrentMediaTime। তবে আপনি যদি ভবিষ্যতের কোনও তারিখে অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় স্মরণ করতে পারে এমন অবিচ্ছিন্ন স্টোরেজে এই শুরুর সময়টি সংরক্ষণ করতে চলেছেন তবে আপনাকে ব্যবহার করতে হবে Dateবা CFAbsoluteTimeGetCurrent, এবং কেবল কোনও প্রকারের ভুল হতে পারে live


4
বাহ, ধন্যবাদ রব! আপনার উত্তর অত্যন্ত সহায়ক এবং বুঝতে সহজ ছিল। আমি সিএফএবিসলিউটটাইম সম্পর্কে টিপটির সত্যই প্রশংসা করি। আমি অবশ্যই এটি ব্যবহার করব!
এরিক 21

সময়ের অভ্যন্তরীণ সিন্সডেটের মাত্রা কী?
ইউজিন

এটি একটি দেয় TimeInterval, যা সেকেন্ডে পরিমাপ করা হয়।
রব

22

এনএসডিট () এবং এনএসক্যালেন্ডার () ভাল পছন্দ মতো শোনায়। ক্যালেন্ডার গণনা ব্যবহার করুন এবং আসল গণিতের অংশটি ফ্রেমওয়ার্কে ছেড়ে দিন। এখানে দু'এর মধ্যে সেকেন্ড পাওয়ার একটি দ্রুত উদাহরণ রয়েছে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)")

কোনও কারণে তারিখগুলি এক ঘন্টা আলাদা থাকলেও এটি সর্বদা আমার জন্য 0 ফেরত দেয়।
মার্ককিমার্ক

11

ফ্রেডির উত্তর অনুসারে, এটি দ্রুত 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))

4
ধন্যবাদ @ লেগমাস্টার। সুইফ্ট এনএস উপসর্গটি সরিয়ে দিয়ে দেখছে।
ফ্রেডি


0

আপনি সুইফট 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

রেফারেন্স: (মাস / দিন / ঘন্টা / মিনিট / সেকেন্ড) মধ্যে দুটি এনএসডিটের মধ্যে পার্থক্য পাওয়া


-1

সুইফট 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)")

4
এটি কোডে সেকেন্ডের মধ্যে পার্থক্য সরবরাহ করে না তবেই শুরুটি বড় হয় কি না।
অরুণ কে

-6

"এইচ: মিমি" তে 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)

এই উত্তরটি অপের উত্তরের সাথে অপ্রাসঙ্গিক।
টমাসজ নাজরেনকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.