Date to milliseconds and back to date in Swift

后端 未结 9 2068
深忆病人
深忆病人 2020-11-29 01:53

I am taking the current time, in UTC, and putting it in nanaoseconds and then I need to take the nanoseconds and go back to a date in local time. I am able to do get the tim

相关标签:
9条回答
  • 2020-11-29 02:25

    Unless you absolutely have to convert the date to an integer, consider using a Double instead to represent the time interval. After all, this is the type that timeIntervalSince1970 returns. All of the answers that convert to integers loose sub-millisecond precision, but this solution is much more accurate (although you will still lose some precision due to floating-point imprecision).

    public extension Date {
        
        /// The interval, in milliseconds, between the date value and
        /// 00:00:00 UTC on 1 January 1970.
        /// Equivalent to `self.timeIntervalSince1970 * 1000`.
        var millisecondsSince1970: Double {
            return self.timeIntervalSince1970 * 1000
        }
    
        /**
         Creates a date value initialized relative to 00:00:00 UTC
         on 1 January 1970 by a given number of **milliseconds**.
         
         equivalent to
         ```
         self.init(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)
         ```
         - Parameter millisecondsSince1970: A time interval in milliseconds.
         */
        init(millisecondsSince1970: Double) {
            self.init(timeIntervalSince1970: TimeInterval(milliseconds) / 1000)
        }
    
    }
    
    0 讨论(0)
  • 2020-11-29 02:29
    //Date to milliseconds
    func currentTimeInMiliseconds() -> Int {
        let currentDate = Date()
        let since1970 = currentDate.timeIntervalSince1970
        return Int(since1970 * 1000)
    }
    
    //Milliseconds to date
    extension Int {
        func dateFromMilliseconds() -> Date {
            return Date(timeIntervalSince1970: TimeInterval(self)/1000)
        }
    }
    

    I removed seemingly useless conversion via string and all those random !.

    0 讨论(0)
  • 2020-11-29 02:34

    Heres a simple solution in Swift 5/iOS 13.

    extension Date {
        
        func toMilliseconds() -> Int64 {
            Int64(self.timeIntervalSince1970 * 1000)
        }
    
        init(milliseconds:Int) {
            self = Date().advanced(by: TimeInterval(integerLiteral: Int64(milliseconds / 1000)))
        }
    }
    

    This however assumes you have calculated the difference between UTF time and local time and adjusted and accounted for in the milliseconds. For that look to calendar

    var cal = Calendar.current
    cal.timeZone = TimeZone(abbreviation: "UTC")!
    let difference = cal.compare(dateGiven, to: date, toGranularity: .nanosecond)
    
    0 讨论(0)
提交回复
热议问题