iOS Swift - 获取当前本地时间和日期时间戳
问题描述:
我正在尝试制作一个考勤应用程序,我对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日在我的位置。
什么是正确的代码使用,以便我可以得到正确的日期时间戳和时间戳记?
答
For savin g当前时间到Firebase数据库我使用Unic Epoch对话:
let timestamp = NSDate().timeIntervalSince1970
和解码Unix Epoch时间到日期()。
let myTimeInterval = TimeInterval(timestamp)
let time = NSDate(timeIntervalSince1970: TimeInterval(myTimeInterval))
答
首先,我会建议您将您的时间戳存储为您的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
存储在数据库中..)
如果你的时区是UTC + 0800,这是正确的。 'print'总是以UTC显示'Date'。 '2017-09-22 16:00:00 + 0000'和'2017-09-23 00:00:00 + 0800'是完全相同的时间点。顺便说一句:不要在Swift 3中使用'NSDate'。 – vadian