Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift convert NSTimeInteval to NSDate

I've been following an Objective-C tutorial and the tutor is able to cast an NSTimeInterval object to a NSDate object.

The lesson uses CoreData, and stores the date of a post as an NSTimeInterval, later on we want to retrieve that interval and set it as a formatted date string to present as a section title in a UITableVIewController.

class DiaryEntry: NSManagedObject {

@NSManaged var date: NSTimeInterval
@NSManaged var body: String
@NSManaged var imageData: NSData
@NSManaged var mood: Int16
@NSManaged var location: String

func sectionName() -> String {
    let date = NSDate().dateByAddingTimeInterval(self.date)
    let f = NSDateFormatter()
    f.dateFormat = "MMM yyy"

    return f.stringFromDate(date)
}

}

Mainly concerned with the line:

let date:NSDate = NSDate().dateByAddingTimeInterval(self.date)

Which right now is actually adding the set date onto the current date, and this is not the behaviour I want.

How do I cast the self.date variable to an NSDate object in SWIFT?

like image 962
Halfpint Avatar asked Nov 24 '14 18:11

Halfpint


2 Answers

This code is really confused.

A time interval is not a date. A date is a point in time. A time interval is the difference in seconds between two points in time. Whenever you have a time interval, you have the question "it is the number of seconds between what two dates? You correctly realise that adding a time interval stored in a database to NSDate () is unlikely to give a useful result, because the same call executed 10 seconds later will give a different date.

The date of a post should most likely be stored as an NSDate object. Core Data handles NSDate objects just fine. If you want to store time intervals, the date of the post must be converted to a time interval since some fixed reference date; you do that for example using "timeIntervalSinceReferenceDate". If you do that, I very strongly recommend that you don't call the variable "date" but something like "secondsSinceReferenceDate" which makes it obvious what to store when you are given a date, and how to convert that number back to an NSDate.

(The reason to call it "secondsSinceReferenceDate" is because there is plenty of code that tries to store milliseconds, or nanoseconds, and there is plenty of code that stores intervals since the epoch (Jan 1st 1970), so it's really good if someone reading your code knows immediately what the numbers mean by just looking at the variable name).

like image 194
gnasher729 Avatar answered Nov 04 '22 18:11

gnasher729


There is a initializer of NSDate that takes NSTimeInterval:

init(timeIntervalSinceReferenceDate ti: NSTimeInterval)

So just do:

var date = NSDate(timeIntervalSinceReferenceDate: 123)
like image 40
Peter Pei Guo Avatar answered Nov 04 '22 19:11

Peter Pei Guo