2017-09-23 425 views
4

我正在嘗試製作一個考勤應用程序,我對iOS和Firebase中的日期和時間非常困惑。iOS Swift - 獲取當前本地時間和日期時間戳

我使用date作爲Key,這是我的Firebase數據庫的結構。

--Employees 
    --Unique_ID 
    --Details 
      Name: John 
    --Attendance 
      --dateToday 
       Timein: 8:00 AM 
       Timeout: 5:00 PM 
       BreakStart: 12:00 PM 
       BreakFinish: 1:00 PM 

這是我的代碼來獲得日期戳我作爲重點

override func viewDidLoad() { 
    super.viewDidLoad() 

    let now = NSDate() 
    let nowTimeStamp = self.getCurrentTimeStampWOMiliseconds(dateToConvert: now) 

    // I save this dateToday as Key in Firebase 
    dateToday = nowTimeStamp 
} 


func getCurrentTimeStampWOMiliseconds(dateToConvert: NSDate) -> String { 
    let objDateformat: DateFormatter = DateFormatter() 
    objDateformat.dateFormat = "yyyy-MM-dd" 
    let strTime: String = objDateformat.string(from: dateToConvert as Date) 
    let objUTCDate: NSDate = objDateformat.date(from: strTime)! as NSDate 
    let milliseconds: Int64 = Int64(objUTCDate.timeIntervalSince1970) 
    let strTimeStamp: String = "\(milliseconds)" 
    return strTimeStamp 
} 

但是,當我將其轉換回日期我得到2017年9月22日16:00:00 +0000,這是錯誤的,因爲它是9月23日在我的位置。

什麼是正確的代碼使用,以便我可以得到正確的日期時間戳和時間戳記?

+3

如果你的時區是UTC + 0800,這是正確的。 'print'總是以UTC顯示'Date'。 '2017-09-22 16:00:00 + 0000'和'2017-09-23 00:00:00 + 0800'是完全相同的時間點。順便說一句:不要在Swift 3中使用'NSDate'。 – vadian

回答

10

For savin g當前時間到Firebase數據庫我使用Unic Epoch對話:

let timestamp = NSDate().timeIntervalSince1970 

和解碼Unix Epoch時間到日期()。

let myTimeInterval = TimeInterval(timestamp) 
let time = NSDate(timeIntervalSince1970: TimeInterval(myTimeInterval)) 
4

首先,我會建議您將您的時間戳存儲爲您的Firebase數據庫中的NSNumber,而不是將其存儲爲String

另一件值得一提的事情是,如果你想用Swift操作日期,除非你在應用程序中使用某些Obj-C代碼進行交互,否則最好使用Date而不是NSDate

你當然也可以同時使用,但文檔狀態:

日期橋到的NSDate類。您可以在與Objective-C API交互的代碼中互換使用這些代碼。

現在要回答你的問題,我認爲這裏的問題是由於時區。

例如,如果你print(Date()),因爲現在,你會得到:

2017-09-23 06:59:34 +0000 

這是格林威治標準時間(GMT)。

所以取決於你所在的位置(或者你的用戶的位置),你需要之前調整時區(或之後,當您試圖訪問數據爲例)存儲您Date

let now = Date() 

    let formatter = DateFormatter() 

    formatter.timeZone = TimeZone.current 

    formatter.dateFormat = "yyyy-MM-dd HH:mm" 

    let dateString = formatter.string(from: now) 

然後你有正確格式的String,反映了你所在位置的當前時間,並且你可以隨意做任何你想做的事情:)(將其轉換爲Date/NSNumber,或直接作爲String存儲在數據庫中..)