2017-09-23 1 views
4

출석 앱을 만들려고하고 있으며 iOS 및 Firebase의 날짜와 시간에 대해 혼란 스럽습니다.iOS Swift - 현재 현지 시간 및 날짜 타임 스탬프 받기

날짜를 키로 사용합니다. 이것은 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시 0분 0초 0000을 얻을, 그것은 내 위치에있는 9 월 23 일이기 때문에 잘못되었습니다.

올바른 날짜 시간 소인 및 시간 소인을 얻을 수 있도록 올바른 코드는 무엇입니까?

+3

시간대가 UTC + 0800 인 경우 정확합니다. 'print'는'Date'를 항상 UTC로 표시합니다. 그리고 '2017-09-22 16:00:00 + 0000'과'2017-09-23 00:00:00 + 0800 '은 똑같은 시점입니다. 그건 그렇고 : Swift 3에서는 NSDate를 사용하지 마십시오. – vadian

답변

10

savin g firebase 데이터베이스에 대한 현재 시간 나는 Unic Epoch 대화를 사용한다 :

let timestamp = NSDate().timeIntervalSince1970 

그리고 Unix Epoch time to date 디코딩을 위해서.

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

먼저 String으로 저장하는 대신 파이어베이스 데이터베이스에 타임 스탬프를 NSNumber으로 저장하는 것이 좋습니다.

여기서 언급 할 가치가있는 또 다른 점은 Swift로 날짜를 조작하려면 NSDate 대신 Date을 사용하는 것이 좋습니다. 단, 앱에서 Obj-C 코드와 상호 작용하는 경우는 예외입니다.

당신은 물론 모두 사용할 수 있지만, 문서 상태 다음있는 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으로 직접 저장하십시오. ..)