iOS Swift-получить текущее местное время и дату отметку времени
Я пытаюсь сделать приложение посещаемости, и я действительно смущен датой и временем в iOS и Firebase.
Я использую дату в качестве ключа, это структура моей базы данных 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-09-22 16:00: 00 +0000, что неправильно, потому что это 23 сентября в моем местоположении.
каков правильный код для использования, чтобы я может ли получить правильную метку времени даты и времени?
2 ответов
для экономии текущего времени в базе данных firebase я использую Unic Epoch Conversation:
let timestamp = NSDate().timeIntervalSince1970
и для декодирования Unix Epoch time to Date ().
let myTimeInterval = TimeInterval(timestamp)
let time = NSDate(timeIntervalSince1970: TimeInterval(myTimeInterval))
сначала я бы рекомендовал вам сохранить вашу метку времени как NSNumber
в вашей базе данных Firebase, вместо того, чтобы хранить ее как String
.
еще одна вещь, которую стоит упомянуть здесь, заключается в том, что если вы хотите манипулировать датами с Swift, вам лучше использовать Date
вместо NSDate
, за исключением случаев, когда вы взаимодействуете с некоторым кодом Obj-C в своем приложении.
вы можете, конечно, использовать оба, но в документации говорится:
чтобы ответить на ваш вопрос, я думаю, что проблема тут из-за часового пояса.мосты даты к NSDate класс. Вы можете использовать их взаимозаменяемо в код, который взаимодействует с API Objective-C.
например, если вы 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
в базе данных..)