85

My current code:

if  let var timeResult = (jsonResult["dt"] as? Double) {
    timeResult = NSDate().timeIntervalSince1970
    println(timeResult)
    println(NSDate())
}

The results:

println(timeResult) = 1415639000.67457

println(NSDate()) = 2014-11-10 17:03:20 +0000 was just to test to see what NSDate was providing.

I want the first to look like the last. The value for dt = 1415637900.

Also, how can I adjust to time zone? Running on iOS.

Joakim Danielson
  • 43,251
  • 5
  • 22
  • 52
MwcsMac
  • 6,810
  • 5
  • 32
  • 52

13 Answers13

133

You can get a date with that value by using the NSDate(withTimeIntervalSince1970:) initializer:

let date = NSDate(timeIntervalSince1970: 1415637900)
Nate Cook
  • 92,417
  • 32
  • 217
  • 178
74

To get the date to show as the current time zone I used the following.

if let timeResult = (jsonResult["dt"] as? Double) {
     let date = NSDate(timeIntervalSince1970: timeResult)
     let dateFormatter = NSDateFormatter()
     dateFormatter.timeStyle = NSDateFormatterStyle.MediumStyle //Set time style
     dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle //Set date style
     dateFormatter.timeZone = NSTimeZone()
     let localDate = dateFormatter.stringFromDate(date)
}

Swift 3.0 Version

if let timeResult = (jsonResult["dt"] as? Double) {
    let date = Date(timeIntervalSince1970: timeResult)
    let dateFormatter = DateFormatter()
    dateFormatter.timeStyle = DateFormatter.Style.medium //Set time style
    dateFormatter.dateStyle = DateFormatter.Style.medium //Set date style
    dateFormatter.timeZone = self.timeZone
    let localDate = dateFormatter.string(from: date)                     
}

Swift 5

if let timeResult = (jsonResult["dt"] as? Double) {
    let date = Date(timeIntervalSince1970: timeResult)
    let dateFormatter = DateFormatter()
    dateFormatter.timeStyle = DateFormatter.Style.medium //Set time style
    dateFormatter.dateStyle = DateFormatter.Style.medium //Set date style
    dateFormatter.timeZone = .current
    let localDate = dateFormatter.string(from: date)                                
}
MwcsMac
  • 6,810
  • 5
  • 32
  • 52
31

It's simple to convert the Unix timestamp into the desired format. Lets suppose _ts is the Unix timestamp in long

let date = NSDate(timeIntervalSince1970: _ts)

let dayTimePeriodFormatter = NSDateFormatter()
dayTimePeriodFormatter.dateFormat = "MMM dd YYYY hh:mm a"

 let dateString = dayTimePeriodFormatter.stringFromDate(date)

  print( " _ts value is \(_ts)")
  print( " _ts value is \(dateString)")
Sachin Tyagi
  • 1,257
  • 15
  • 21
15

For managing dates in Swift 3 I ended up with this helper function:

extension Double {
    func getDateStringFromUTC() -> String {
        let date = Date(timeIntervalSince1970: self)

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_US")
        dateFormatter.dateStyle = .medium

        return dateFormatter.string(from: date)
    }
}

This way it easy to use whenever you need it - in my case it was converting a string:

("1481721300" as! Double).getDateStringFromUTC() // "Dec 14, 2016"

Reference the DateFormatter docs for more details on formatting (Note that some of the examples are out of date)

I found this article to be very helpful as well

crobicha
  • 1,674
  • 1
  • 16
  • 21
9

Here is a working Swift 3 solution from one of my apps.

/**
 * 
 * Convert unix time to human readable time. Return empty string if unixtime     
 * argument is 0. Note that EMPTY_STRING = ""
 *
 * @param unixdate the time in unix format, e.g. 1482505225
 * @param timezone the user's time zone, e.g. EST, PST
 * @return the date and time converted into human readable String format
 *
 **/

private func getDate(unixdate: Int, timezone: String) -> String {
    if unixdate == 0 {return EMPTY_STRING}
    let date = NSDate(timeIntervalSince1970: TimeInterval(unixdate))
    let dayTimePeriodFormatter = DateFormatter()
    dayTimePeriodFormatter.dateFormat = "MMM dd YYYY hh:mm a"
    dayTimePeriodFormatter.timeZone = NSTimeZone(name: timezone) as TimeZone!
    let dateString = dayTimePeriodFormatter.string(from: date as Date)
    return "Updated: \(dateString)"
}
zeeshan
  • 4,913
  • 1
  • 49
  • 58
6
func timeStringFromUnixTime(unixTime: Double) -> String {
    let date = NSDate(timeIntervalSince1970: unixTime)

    // Returns date formatted as 12 hour time.
    dateFormatter.dateFormat = "hh:mm a"
    return dateFormatter.stringFromDate(date)
}

func dayStringFromTime(unixTime: Double) -> String {
    let date = NSDate(timeIntervalSince1970: unixTime)
    dateFormatter.locale = NSLocale(localeIdentifier: NSLocale.currentLocale().localeIdentifier)
    dateFormatter.dateFormat = "EEEE"
    return dateFormatter.stringFromDate(date)
}
Durul Dalkanat
  • 7,266
  • 4
  • 35
  • 36
  • The method I am using shows the time as 12 hour unless the user sets the phone to 24 hour then it shows up as 24 hour. Also complete what I need in one func instead of two. Can you explain your answer as what the benefit would be? – MwcsMac Aug 15 '15 at 05:43
  • 1
    My example shows pacific standard time. For Example in US are using Am & Pm standarts. Some Api such as forecast.io is giving unix time standarts. – Durul Dalkanat Aug 16 '15 at 08:58
  • 1
    Fixed my own answer to show the complete code that I end up using. With that code it converts the unix time to local time base on your location. Also with the way I have the app programed it will follow the phone settings for 12hr or 24hr. – MwcsMac Aug 16 '15 at 20:08
4

In Swift 5

Using this implementation you just have to give epoch time as a parameter and you will the output as (1 second ago, 2 minutes ago, and so on).

func setTimestamp(epochTime: String) -> String {
    let currentDate = Date()
    let epochDate = Date(timeIntervalSince1970: TimeInterval(epochTime) as! TimeInterval)

    let calendar = Calendar.current

    let currentDay = calendar.component(.day, from: currentDate)
    let currentHour = calendar.component(.hour, from: currentDate)
    let currentMinutes = calendar.component(.minute, from: currentDate)
    let currentSeconds = calendar.component(.second, from: currentDate)

    let epochDay = calendar.component(.day, from: epochDate)
    let epochMonth = calendar.component(.month, from: epochDate)
    let epochYear = calendar.component(.year, from: epochDate)
    let epochHour = calendar.component(.hour, from: epochDate)
    let epochMinutes = calendar.component(.minute, from: epochDate)
    let epochSeconds = calendar.component(.second, from: epochDate)

    if (currentDay - epochDay < 30) {
        if (currentDay == epochDay) {
            if (currentHour - epochHour == 0) {
                if (currentMinutes - epochMinutes == 0) {
                    if (currentSeconds - epochSeconds <= 1) {
                        return String(currentSeconds - epochSeconds) + " second ago"
                    } else {
                        return String(currentSeconds - epochSeconds) + " seconds ago"
                    }

                } else if (currentMinutes - epochMinutes <= 1) {
                    return String(currentMinutes - epochMinutes) + " minute ago"
                } else {
                    return String(currentMinutes - epochMinutes) + " minutes ago"
                }
            } else if (currentHour - epochHour <= 1) {
                return String(currentHour - epochHour) + " hour ago"
            } else {
                return String(currentHour - epochHour) + " hours ago"
            }
        } else if (currentDay - epochDay <= 1) {
            return String(currentDay - epochDay) + " day ago"
        } else {
            return String(currentDay - epochDay) + " days ago"
        }
    } else {
        return String(epochDay) + " " + getMonthNameFromInt(month: epochMonth) + " " + String(epochYear)
    }
}


func getMonthNameFromInt(month: Int) -> String {
    switch month {
    case 1:
        return "Jan"
    case 2:
        return "Feb"
    case 3:
        return "Mar"
    case 4:
        return "Apr"
    case 5:
        return "May"
    case 6:
        return "Jun"
    case 7:
        return "Jul"
    case 8:
        return "Aug"
    case 9:
        return "Sept"
    case 10:
        return "Oct"
    case 11:
        return "Nov"
    case 12:
        return "Dec"
    default:
        return ""
    }
}

How to call?

setTimestamp(epochTime: time) and you'll get the desired output as a string.

halfer
  • 19,824
  • 17
  • 99
  • 186
Divyansh Jain
  • 373
  • 2
  • 5
  • This adds more complexity than the desired result. Which was just converting the time stamp from a static json file to a readable format. – MwcsMac Nov 14 '19 at 18:27
3

Convert timestamp into Date object.

If timestamp object is invalid then return current date.

class func toDate(_ timestamp: Any?) -> Date? {
    if let any = timestamp {
        if let str = any as? NSString {
            return Date(timeIntervalSince1970: str.doubleValue)
        } else if let str = any as? NSNumber {
            return Date(timeIntervalSince1970: str.doubleValue)
        }
    }
    return nil
}
Nil Rathod
  • 450
  • 5
  • 21
2

Swift:

extension Double {
    func getDateStringFromUnixTime(dateStyle: DateFormatter.Style, timeStyle: DateFormatter.Style) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = dateStyle
        dateFormatter.timeStyle = timeStyle
        return dateFormatter.string(from: Date(timeIntervalSince1970: self))
    }
}
Juan Boero
  • 6,281
  • 1
  • 44
  • 62
1

Anyway @Nate Cook's answer is accepted but I would like to improve it with better date format.

with Swift 2.2, I can get desired formatted date

//TimeStamp
let timeInterval  = 1415639000.67457
print("time interval is \(timeInterval)")

//Convert to Date
let date = NSDate(timeIntervalSince1970: timeInterval)

//Date formatting
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd, MMMM yyyy HH:mm:a"
dateFormatter.timeZone = NSTimeZone(name: "UTC")
let dateString = dateFormatter.stringFromDate(date)
print("formatted date is =  \(dateString)")

the result is

time interval is 1415639000.67457

formatted date is = 10, November 2014 17:03:PM

Community
  • 1
  • 1
swiftBoy
  • 35,607
  • 26
  • 136
  • 135
0

If you are maximizing the Codable protocol for parsing your JSON data. You could simply make the data type of dt as Date and do:

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
Rhenz
  • 2,293
  • 1
  • 14
  • 14
-1

For me: Converting timestamps coming from API to a valid date :

`let date = NSDate.init(fromUnixTimestampNumber: timesTamp /* i.e 1547398524000 */) as Date?`
halfer
  • 19,824
  • 17
  • 99
  • 186
Siempay
  • 876
  • 1
  • 11
  • 32
-1

By using this code you will be able to convert timeStamp to Time and Date

let timeStamp = Date().timeIntervalSince1970

let date = NSDate(timeIntervalSince1970: timeStamp)

let dayTimePeriodFormatter = DateFormatter()

dayTimePeriodFormatter.dateFormat = "dd MMMM,YYYY.hh:mm a"

let dateTimeString = dayTimePeriodFormatter.string(from: date as Date)

let dateTime = dateTimeString.split(separator: ".")

print( "Date = \(dateTime[0])")

print( "Time = \(dateTime[1])")

Output: 

Date = 19 January,2022

Time = 10:46 AM
Montresor
  • 806
  • 6
  • 22