รับ Unix Epoch Time ใน Swift


103

คุณจะได้รับวินาทีจาก epoch ใน Swift ได้อย่างไร?


2
เช่นเดียวกับใน Objective-C - ใช้ NSDate
gnasher729

2
ฉันหลีกเลี่ยงการพัฒนาผลิตภัณฑ์ของ Apple เพราะฉันเกลียด Objective-C ดังนั้นฉันไม่ได้เรียนรู้มัน และฉันรู้ว่าไวยากรณ์ของ Swift นั้นแตกต่างกันเล็กน้อย เพียงแค่แสดงไวยากรณ์ สร้างชื่อเสียงให้ตัวเองง่ายๆ
Chris Redford


3
- timeIntervalSince1970ไม่มีก็เชื่อมโยงโดยตรงกับรายการสำหรับวิธีการที่สวิฟท์:
zaph

3
อันที่จริงฉันเชื่อมโยงกับวิธีการเฉพาะ :)
Martin R

คำตอบ:


163

คุณสามารถใช้timeIntervalSince1970ฟังก์ชันของ NSDate ได้

let timeInterval = NSDate().timeIntervalSince1970

7
โปรดทราบว่าสิ่งนี้จำเป็นต้องนำเข้า Foundation
AlBlue

3
ถ้าไม่ใช้ Foundation ล่ะ?
marius

3
หากคุณไม่ต้องการใช้รองพื้นคุณสามารถใช้ AFNetworking / AlamoFire ( github.com/Alamofire/Alamofire ) เพื่อโหลดcurrentmillis.comจากนั้นแยกวิเคราะห์ html ของหน้า โปรดทราบว่าคุณต้องคำนึงถึงความล่าช้าของเครือข่ายและตรวจสอบการเชื่อมต่อ ฉันตัดสินใจใช้ Foundation ...
Chase Roberts

2
แล้วในฐานะ int ล่ะ?
rstackhouse

85

สำหรับ Swift 3.0

Date().timeIntervalSince1970

2
สิ่งที่ดี. นอกจากนี้ผู้คนอาจสนใจstackoverflow.com/questions/39811352/swift-3-date-vs-nsdate
Matt Johnson-Pint

49
รูปแบบเวลา UNIX เป็นมิลลิวินาที ดังนั้น Int (วันที่ () timeIntervalSince1970 * 1000)
CHiP-love-NY

10
@ CHiP-love-NY: ไม่จริง เวลา Unixคือจำนวนวินาทีนับตั้งแต่วันที่ 1 มกราคม 1970 UTC
Martin R

1
ส่งคืนTimeIntervalซึ่งอยู่ใน secods
Daniel

1

คุณสามารถรับสิ่งนั้นได้โดยใช้สิ่งต่อไปนี้

Int(Date().timeIntervalSince1970)

สำหรับวันที่ปัจจุบันหากคุณต้องการรับวันที่ที่กำหนด

Int(myDate.timeIntervalSince1970)

หากคุณต้องการแปลงจากช่วงเวลา UNIX เป็น Swift Date time คุณสามารถใช้สิ่งต่อไปนี้

let date = Date(timeIntervalSince1970: unixtEpochTime)

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

Swift's timeIntervalSince1970คืนค่าวินาทีด้วยสิ่งที่บันทึกไว้ว่ามีความแม่นยำ "sub-millisecond" ซึ่งฉันสังเกตว่าโดยปกติแล้วจะมีค่าเฉลี่ยเป็นไมโครวินาที แต่บางครั้งก็มีค่าหนึ่งมาตราส่วน (หนึ่งหลักทางขวาของทศนิยม) น้อยกว่าหรือมากกว่า เมื่อส่งกลับมาตราส่วน 5 (5 หลักหลังทศนิยม) ฉันไม่รู้ว่า Swift วางเครื่องหมายท้าย 0 หรือไม่หรือไม่สามารถสร้างความแม่นยำได้ 6 ระดับ แต่เมื่อส่งกลับสเกลเป็น 7 หลักพิเศษนั้นอาจถูกตัดทอนได้เนื่องจากมีความแม่นยำสูงเกินระดับไมโครวินาที ดังนั้นสำหรับค่าที่สอดคล้องและแม่นยำ - จริง:

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

อย่างไรก็ตามน่าเสียดายที่ในปี 2038 ตัวเลข 32 บิตจะไม่สามารถใช้กับการประทับเวลา Unix ได้และจะต้องเป็น 64 บิต

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

ส่วนขยาย:

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

Date().unixTimestamp

0

หากคุณไม่ต้องการนำเข้า Foundation เช่นสำหรับการใช้งาน Linux เป็นต้นคุณสามารถใช้สิ่งต่อไปนี้จาก CoreFoundation:

import CoreFoundation

let timestamp = CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970

คุณรู้หรือไม่ว่าเมื่อไหร่สิ่งที่เดทและเพื่อน ๆ จะกลายเป็นข้ามแพลตฟอร์ม?
ZoltánMatók

@ ZoltánMatókฉันได้ยินมาว่าพวกเขามีแผนที่จะนำ Foundation มาใช้อีกครั้งในการเปิด ดูที่ forums.swift.org สำหรับข้อมูลเพิ่มเติม
rshev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.