2017-09-23 424 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存储在数据库中..)