Search code examples
iosswiftdatensdateformatter

Converting 12 digit ticks to Date


I am trying to convert 12 digit c# date time ticks formatted time. (648000000000). With the help of following link I added an extension to my code How to get 18-digit current timestamp in Swift?.

extension Date {
    init(ticks: UInt64) {
        self.init(timeIntervalSince1970: Double(ticks)/10_000_000 - 62_135_596_800)
    }
}

let date = Date(ticks: 648000000000)

When I try to see result date it prints following;

0001-01-03 18:00:00 +0000

However, when I try to convert it hour and minute format output is irrelevant like 19:55

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
dateFormatter.string(from: date)

My first question is how can I format it to get only 18:00. Second is why it is printing 18:00 when I print only date, but 19:55 when I format it?


Solution

  • Just don't subtract 62_135_596_800

    extension Date {
        init(ticks: UInt64) {
            self.init(timeIntervalSince1970: Double(ticks)/10_000_000)
        }
    }
    

    1970-01-01 18:00:00 +0000

    The other problem: When you create date and print it, the string is formatted in UTC time zone (offset GMT+0). But DateFormatter returns string representation dependent on its time zone, which is the local timezone by default.

    You can fix your code just by setting dateFormatter's timeZone to UTC

    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    

    18:00