IT

iOS Swift - 현재 현지 시간 및 날짜 타임스탬프 가져오기

itgroup 2023. 6. 22. 21:41
반응형

iOS Swift - 현재 현지 시간 및 날짜 타임스탬프 가져오기

출석 앱을 만들려고 하는데 iOS와 파이어베이스에서 날짜와 시간이 정말 헷갈립니다.

날짜를 키로 사용합니다. 이것이 제 파이어베이스 데이터베이스의 구조입니다.

--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이 나오는데, 이는 제가 사는 곳이 9월 23일이기 때문에 잘못된 것입니다.

올바른 날짜 타임스탬프와 시간 타임스탬프를 얻을 수 있는 올바른 코드는 무엇입니까?

파이어베이스 데이터베이스에 현재 시간을 절약하려면 유니크 에포크 컨버세이션을 사용합니다.

let timestamp = NSDate().timeIntervalSince1970

그리고 Unix Epoch time to Date()를 디코딩하는 경우.

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

unix 타임스탬프만 사용하려면 확장자를 만듭니다.

extension Date {
    func currentTimeMillis() -> Int64 {
        return Int64(self.timeIntervalSince1970 * 1000)
    }
}

그러면 다른 프로그래밍 언어와 마찬가지로 사용할 수 있습니다.

let timestamp = Date().currentTimeMillis()

를 저먼타탬다같음저이것장권을다장니합할과를프임으로 하는 것을 합니다.NSNumber할 수 .String.

여기서 언급할 가치가 있는 또 다른 것은 만약 당신이 스위프트와 데이트를 조작하고 싶다면, 당신은 사용하는 것이 낫다는 것입니다.DateNSDate앱에서 일부 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을 당신의 으로 무엇이든 롭게 할 수 (a 반 고 영 위 의 치 그 현 convert 당 그 당 원 자 것 롭 게 유 수 할 있 로 습 니 다 으 로 당 다 것 니 은 :)Date/NSNumber으로 합니다.String데이터베이스에...)

스위프트 5에서

extension Date {
    static var currentTimeStamp: Int64{
        return Int64(Date().timeIntervalSince1970 * 1000)
    }
}

다음과 같이 부릅니다.

let timeStamp = Date.currentTimeStamp
print(timeStamp)

@lenooh 감사합니다.

현재 타임스탬프를 만드는 간단한 방법.아래와 같이,

func generateCurrentTimeStamp () -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy_MM_dd_hh_mm_ss"
    return (formatter.string(from: Date()) as NSString) as String
}

you can call like this:

let timeStmp = generateCurrentTimeStamp()
print("time stamp: \(timeStmp)")

iOS 13.0 이상을 코드화하고 타임스탬프를 원한다면 다음을 사용할 수 있습니다.

let currentDate = NSDate.now

@MaccoAzul의 답변을 확장하는 것에 대해 다음은 저의 현재 작업 예입니다.

import SwiftUI

struct TimestampDemo: View {
    var body: some View {
        
        Text(getActualTimeStamp(1))
            .padding(10)
       
        Text(getActualTimeStamp(2))
            .padding(10)
        
        Text(getActualTimeStamp(3))
            .padding(10)
        
        Text(getActualTimeStamp(4))
            .padding(10)
    }
    
    
    func getActualTimeStamp(_ tipo:Int) -> String {
            let date = Date()
            let formatter = DateFormatter()
            if tipo == 1{
                formatter.dateFormat = "dd/MM/yyyy"
            } else if tipo == 2{
                formatter.dateFormat = "yyyy-MM-dd HH:mm"
            }else if tipo == 3{
                formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            }
            else if tipo == 4  {
                formatter.dateFormat = "dd-MM-yyyy"
            }

            return formatter.string(from: date)
        }
}

struct TimestampDemo_Previews: PreviewProvider {
    static var previews: some View {
        TimestampDemo()
    }
}

enter image description here

빠른 언어 버전: 5

UTC 타임스탬프를 변환할 때(2017-11-06 20:15:33 -08:00으로.Date개체, 시간대가 GMT로 0으로 설정됩니다.시간 간격을 계산하는 경우에는 문제가 되지 않지만 UI에서 렌더링 시간에 대한 문제일 수 있습니다.

저는 RFC3339 형식을 선호합니다).2017-11-06T20:15:33-08:00) 보편성을 위해.Swift의 날짜 형식은 다음과 같습니다.yyyy-MM-dd'T'HH:mm:ssXXXXX하지만 RFC3339는 우리가 이를 활용할 수 있게 해줍니다.ISO8601DateFormatter:

func getDateFromUTC(RFC3339: String) -> Date? {
    let formatter = ISO8601DateFormatter()
    return formatter.date(from: RFC3339)
}

RFC3339는 또한 시간대 추출을 단순화합니다.

func getTimeZoneFromUTC(RFC3339: String) -> TimeZone? {

    switch RFC3339.suffix(6) {

    case "+05:30":
        return TimeZone(identifier: "Asia/Kolkata")

    case "+05:45":
        return TimeZone(identifier: "Asia/Kathmandu")

    default:
        return nil

    }

}

우리는 37개 정도의 다른 시간대를 고려해야 합니다. 그리고 어떤 시간대를 결정할지는 여러분에게 달려 있습니다. 왜냐하면 확실한 목록이 없기 때문입니다.일부 표준은 더 적은 시간대와 더 많은 시간대를 계산합니다.대부분의 시간대는 한 시간에 중단되고, 어떤 시간대는 30분에, 어떤 시간대는0:45의 일부.0:15.

위의 두 가지 방법을 결합하여 다음과 같은 작업을 수행할 수 있습니다.

func getFormattedDateFromUTC(RFC3339: String) -> String? {

    guard let date = getDateFromUTC(RFC3339: RFC3339),
        let timeZone = getTimeZoneFromUTC(RFC3339: RFC3339) else {
            return nil
    }

    let formatter = DateFormatter()
    formatter.dateFormat = "h:mma EEE, MMM d yyyy"
    formatter.amSymbol = "AM"
    formatter.pmSymbol = "PM"
    formatter.timeZone = timeZone // preserve local time zone
    return formatter.string(from: date)

}

그래서 끈은"2018-11-06T17:00:00+05:45"그것은 5시를 나타냅니다.카트만두 어딘가에서 PM이 인쇄될 것입니다.5:00PM Tue, Nov 6 2018기계 위치에 관계없이 로컬 시간 표시

또한 원격 데이터는 서버와 클라이언트 간의 마찰을 최소화하기 위해 독립적이어야 하기 때문에 원격 데이터를 문자열로 저장하는 것이 좋습니다(원본 날짜 개체가 있는 Firestore 포함).

필요에 따라 다른 타임스탬프를 반환하는 기능을 만들 수도 있습니다.

func dataatual(_ tipo:Int) -> String {
        let date = Date()
        let formatter = DateFormatter()
        if tipo == 1{
            formatter.dateFormat = "dd/MM/yyyy"
        } else if tipo == 2{
            formatter.dateFormat = "yyyy-MM-dd HH:mm"
        } else {
            formatter.dateFormat = "dd-MM-yyyy"
        }

        return formatter.string(from: date)
    } 

언급URL : https://stackoverflow.com/questions/46376823/ios-swift-get-the-current-local-time-and-date-timestamp

반응형