NSDate timeIntervalSince1970 not working in Swift?
1432233446145
most probably is a time interval given in milliseconds:
let date = NSDate(timeIntervalSince1970: 1432233446145.0/1000.0)
print("date is \(date)")
// date is 2015-05-21 18:37:26 +0000
Swift 3 and later:
let date = Date(timeIntervalSince1970: 1432233446145.0/1000.0)
Swift: Precision with timeIntervalSince1970
The issue there is that DateFormatter
is limited to milliseconds. There is no way to display more than 3 fraction digits using it.
extension Formatter {
static let iso8601withFractionalSeconds: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSXXXXX"
return formatter
}()
}
Formatter.iso8601withFractionalSeconds.string(from: Date()) // "2020-10-29T16:12:27.111000000Z"
If you would like to get the initial value back you just need top get the timeIntervalSince1970 from your convertedTime date:
let epochTime: TimeInterval = 1597269862.9328
print("\(epochTime) Precise Epoch Time")
let convertedTime = Date(timeIntervalSince1970: epochTime)
print("\(convertedTime) Time converted To Swift Date")
print(convertedTime.timeIntervalSince1970) // "1597269862.9328\n"
Note that Swift Date
is stored as the time interval since reference date. If you would like to preserve the date accuracy you should use timeIntervalSinceReferenceDate instead of timeIntervalSince1970 when archiving it. Check this post.
timeIntervalSince1970 issue in Swift 3
You forgot the argument-label value
in NSNumber
's initializer:
let timeStamp = NSNumber(value: Date().timeIntervalSinceNow)
Have a look at the documentation of NSNumber
: https://developer.apple.com/reference/foundation/nsnumber/1407545-init
Additionally, you don't need to convert the TimeInterval
returned by timeIntervalSinceNow
to an Int
. TimeInterval
is a typealias of Double
and there is an initializer to create a NSNumber
from a Double
.
How to convert from NSDate(timeIntervalSince1970 to NSDate()?
In Swift 3, NSCalendar.current
returns a Calendar
, which is the
Swift value wrapper type for the Foundation NSCalendar
type.
dateComponents()
takes a Set<Calendar.Component>
and two Date
arguments. Date
is the Swift value wrapper type for NSDate
.
When existing Foundation APIs are imported into Swift, the types are bridged automatically, that why NSCalendar.current
returns a Calender
and not NSCalendar
.
The values types are preferred in Swift 3 because they
provide proper value semantics and use let
and var
instead
of immutable and mutable variants.
Putting it all together:
let fromDate = Date(timeIntervalSince1970: ...)
let toDate = Date()
let components = Set<Calendar.Component>([.second, .minute, .hour, .day, .weekOfMonth])
let differenceOfDate = Calendar.current.dateComponents(components, from: fromDate, to: toDate)
For more information about Swift 3 value wrapper types and
their corresponding Foundation types, see
SE-0069 Mutability and Foundation Value Types,
or the section "Bridged Types" in
Working with Cocoa Frameworks in the "Using Swift with Cocoa and Objective-C"
reference.
`[[NSDate date] timeIntervalSince1970]` in (C) free function always returns same value
The issue is that NSTimeInterval
(which is what timeIntervalSince1970
returns) is a double
and you’re casting it to a float
. But float
can only capture roughly 7 significant digits. That’s not nearly accurate enough to capture the number of seconds since 1970, much less the number of milliseconds.
Your lambda solution works simply because you removed the float
cast. You can do the same with your function:
double now_ms() {
return 1000.0 * [[NSDate date] timeIntervalSince1970];
}
Unix dateTime format not properly converted in swift 5
Seems like you are getting milliseconds
that you need to convert to seconds
before creating date
as,
let time: TimeInterval = 1570088096210/1000
let dateFinal = Date(timeIntervalSince1970: time)
print(dateFinal.description)
2019-10-03 07:34:56 +0000
How to create a time stamp from nsdate(timeintervalsince1970)
What you are looking for is DateComponentsFormatter
. You can look at the different formatters Foundation
offers, here.
If you want to have a string that denotes the amount of time that has elapsed since a given date, you can say something like:
if let seconds = posts[visibli.row].timeStamp {
let time = Date(timeIntervalSince1970: TimeInterval(seconds))
let dateComponentsFormater = DateComponentsFormatter()
dateComponentsFormater.unitsStyle = .positional
let string = dateComponentsFormater.string(from: time, to: Date())
labelTime.text = string
}
(Swift) timeIntervalSince1970 stored in Realm with current dateTime, but showing wrong date when it is read?
Update your getCurrentTimeIntervalSince1970 func to this
func getCurrentTimeIntervalSince1970() -> Int {
return Int(Date().timeIntervalSince1970)
}
let date = getCurrentTimeIntervalSince1970()
debugPrint(date)
debugPrint(Date(timeIntervalSince1970: Double(date)))
Result
1582711543
2020-02-26 10:05:43 +0000
Date(timeIntervalSince1970:) returns 2 different results
The timeIntervalSince1970
initializer sets up the time in the UTC timezone, while your API might be sending date
s in GMT. When you are using print(data)
, you have different results, because if you are not using a DateFormatter
to generate the String
format of the Date
object, it uses your devices current settings when formatting the Date
object.
A Date
object represents an absolute point in time, but when you are printing it with a DateFormatter
, it gets converted into a location/time zone specific, relative representation. You just have to set up your DateFormatter
to match the time zone settings of your API and you will see the dates correctly printed.
Dates are not equal while using timeIntervalSince1970
The problem is the usage of timeIntervalSince1970
. If you use this, the Date
implementation will do some Double
calculations to align it to the reference date (2001-01-01).
If you use timeIntervalSinceReferenceDate
instead, this will be used directly, and your code should work then:
for i in 1...200000 {
let date1 = Date()
let date2 = Date(timeIntervalSinceReferenceDate: date1.timeIntervalSinceReferenceDate)
if (date1 != date2) {
// never called on my machine:
let delta = date1.timeIntervalSince(date2)
print("\(i): \(delta)")
}
}
For your information, here the interesting parts of struct Date
implementation on https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/Date.swift - you see the calculation done in the first init
:
public struct Date : ReferenceConvertible, Comparable, Equatable {
fileprivate var _time: TimeInterval
public static let timeIntervalBetween1970AndReferenceDate: TimeInterval = 978307200.0
public init(timeIntervalSince1970: TimeInterval) {
self.init(timeIntervalSinceReferenceDate: timeIntervalSince1970 - Date.timeIntervalBetween1970AndReferenceDate)
}
public init(timeIntervalSinceReferenceDate ti: TimeInterval) {
_time = ti
}
}
Related Topics
Protocol Doesn't Conform to Itself
Getting a "This Application Is Modifying the Autolayout Engine from a Background Thread" Error
Convert String to Date in Swift
How to Get Ip Address in Swift
Firestore Search Array Contains For Multiple Values
Multiple Functions With the Same Name
Nsuserdefaults Not Working on Xcode Beta With Watch Os2
Cannot Assign Property in Method of Struct
Can Swift Return Value from an Async Void-Returning Block
Using a Dispatch_Once Singleton Model in Swift
Saving Custom Swift Class With Nscoding to Userdefaults
What's the Cleanest Way of Applying Map() to a Dictionary in Swift
Send Data from Tableview to Detailview Swift
Nsdate Timeintervalsince1970 Not Working in Swift