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 в базе данных..)