iOS Swift – 获取当前本地时间和date时间戳

我试图制作一个出席应用程序,我对iOS和Firebase的date和时间非常困惑。

我使用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 

这是我的代码来获取我用作Key的date时间戳

  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 } 

但是,当我把它转换回date我得到2017-09-22 16:00:00 +0000,这是错误的,因为它是9月23日在我的位置。

什么是正确的代码使用,以便我可以得到正确的date时间戳和时间戳记?

为了节省Firebase数据库的当前时间我使用Unic Epoch对话:

 let timestamp = NSDate().timeIntervalSince1970 

和解码Unix纪元时间到date()。

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

首先,我build议您将时间戳存储为Firebase数据库中的NSNumber ,而不是将其存储为String

另外值得一提的是,如果你想用Swift处理date,除了在应用程序中使用某些Obj-C代码之外,最好使用Date而不是NSDate

你当然可以同时使用,但是文档指出:

date桥接到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存储在数据库中。 。)