Nhận thời gian kỷ nguyên Unix bằng Swift


102

Làm cách nào để bạn có được giây từ kỷ nguyên trong Swift?


2
Tương tự như trong Objective-C - sử dụng NSDate.
gnasher729

2
Tôi đã tránh phát triển các sản phẩm của Apple vì tôi ghét Objective-C. Do đó, tôi đã không học được nó. Và tôi biết rằng cú pháp Swift ít nhất là hơi khác một chút. Chỉ cho tôi cú pháp. Kiếm cho mình một số danh tiếng SO dễ dàng.
Chris Redford


3
Không, nó liên kết trực tiếp đến sự xâm nhập đối với phương pháp Swift: - timeIntervalSince1970.
zaph

3
Trên thực tế, tôi đã liên kết với phương pháp cụ thể :)
Martin R

Câu trả lời:


162

Bạn chỉ cần sử dụng timeIntervalSince1970chức năng của NSDate .

let timeInterval = NSDate().timeIntervalSince1970

7
Lưu ý rằng điều này cần phải nhập Foundation.
AlBlue

3
làm thế nào về mà không sử dụng Foundation?
marius

3
Nếu bạn không muốn sử dụng nền tảng thì bạn có thể sử dụng AFNetworking / AlamoFire ( github.com/Alamofire/Alamofire ) để tải currentmillis.com và sau đó phân tích cú pháp html của trang. Lưu ý rằng bạn phải tính đến sự chậm trễ của mạng và kiểm tra kết nối. Tôi quyết định chỉ sử dụng Foundation ...
Chase Roberts

2
Làm thế nào về như một int?
rstackhouse

82

Đối với Swift 3.0

Date().timeIntervalSince1970

2
Tốt. Ngoài ra, mọi người có thể quan tâm đến stackoverflow.com/questions/39811352/swift-3-date-vs-nsdate
Matt Johnson-Pint

49
Định dạng thời gian UNIX là mili giây. Vì vậy, Int (Date () timeIntervalSince1970 * 1000.)
Chip-love-NY

9
@ CHiP-love-NY: Điều đó không đúng. Unix time là số giây kể từ ngày 1 tháng 1 năm 1970, giờ UTC.
Martin R

1
Nó trả về TimeInterval , tính bằng giây
Daniel

1

Bạn có thể nhận được điều đó bằng cách sử dụng sau

Int(Date().timeIntervalSince1970)

Đây là cho ngày hiện tại, nếu bạn muốn đến một ngày nhất định

Int(myDate.timeIntervalSince1970)

Nếu bạn muốn chuyển đổi lại từ kỷ nguyên thời gian UNIX thành Swift Date time, bạn có thể sử dụng sau

let date = Date(timeIntervalSince1970: unixtEpochTime)

0
1 second      = -
1 millisecond = 1,000 seconds
1 microsecond = 1,000,000 seconds

Swift timeIntervalSince1970trả về giây với những gì được ghi lại là độ chính xác "dưới mili giây", mà tôi đã quan sát có nghĩa là thường là micro giây nhưng đôi khi một tỷ lệ (một chữ số ở bên phải của số thập phân) ít hơn hoặc nhiều hơn. Khi nó trả về thang đo 5 (5 chữ số sau số thập phân), tôi không biết liệu Swift có bỏ dấu 0 ở cuối hay không hay nó không thể tạo ra 6 thang độ chính xác. Nhưng khi nó trả về thang điểm 7, chữ số thừa đó có thể bị cắt bớt vì nó vượt quá độ chính xác micro giây. Do đó, để có các giá trị nhất quán và chính xác-đúng:

let preciseSeconds = Int(Date().timeIntervalSince1970)
let preciseMilliseconds = Int(Date().timeIntervalSince1970 * 1_000)
let preciseMicroseconds = Int(Date().timeIntervalSince1970 * 1_000_000) // most likely precise

Tuy nhiên, thật không may, vào năm 2038, các số 32 bit sẽ không thể sử dụng được cho dấu thời gian Unix và chúng sẽ phải là 64 bit.

let seconds = Date().timeIntervalSince1970
let milliseconds = Date().timeIntervalSince1970 * 1_000
let microseconds = Date().timeIntervalSince1970 * 1_000_000

Một phần mở rộng:

extension Date {
    var unixTimestamp: Int64 {
        return Int64(self.timeIntervalSince1970 * 1_000)
    }
}

Date().unixTimestamp

0

Nếu bạn không muốn nhập Foundation, tức là để sử dụng Linux, v.v., bạn có thể sử dụng cách sau từ CoreFoundation:

import CoreFoundation

let timestamp = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970

Bạn có biết khi nào mọi thứ có thể Hẹn hò và bạn bè trở nên đa nền tảng không?
Zoltán Matók

@ ZoltánMatók Tôi nghe nói rằng họ có kế hoạch triển khai lại nhiều hơn nữa Foundation trong thời gian mở. Hãy xem forum.swift.org để biết thêm thông tin.
rshev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.