日期转换迅速而不会丢失

时间:2019-11-15 14:39:33

标签: ios swift date

目标/问题

我想将Date转换为String,然后再转换回Date。我能够做到这一点,但在途中我失去了精确度。如何确保在此过程中不会丢失单个 bit

1573827905079978157382790508

主要代码

var now = Date()

var now_as_string = Date.dateAsString(style: .dayMonthYearHourMinuteSecondMillisecondTimezone, date: now)
var back_as_date =   Date.stringAsDate(style: .dayMonthYearHourMinuteSecondMillisecondTimezone, string: now_as_string)

print(Date.dateAsTimeIntervalSince1970WithoutDots(date: now))
print(Date.dateAsTimeIntervalSince1970WithoutDots(date: back_as_date))

输出

1573827905079978

157382790508

日期扩展(真正的魔术发生的地方)

import Foundation

extension Date {

    enum Style {
        case dayMonthYear
        case dayMonthYearHourMinute
        case dayMonthYearHourMinuteSecondMillisecondTimezone
    }

    static func dateAsString(style: Date.Style, date: Date) -> String{

        let formatter = DateFormatter()
        formatter.dateFormat = fromStyleToString(style: style)

        return formatter.string(from: date)

    }

    private static func fromStyleToString(style: Date.Style) -> String{

        switch style {

        case .dayMonthYear:
            return "dd.MM.yyyy"

        case .dayMonthYearHourMinute:
            return "dd.MM.yyyy HH:mm"

        case .dayMonthYearHourMinuteSecondMillisecondTimezone:
            return "dd.MM.yyyy HH:mm:ss:SSS Z"

        }

    }

    static func stringAsDate(style: Date.Style, string: String) -> Date{

        let formatter = DateFormatter()
        formatter.dateFormat = fromStyleToString(style: style)
        return formatter.date(from: string)!

    }

    static func dateAsTimeIntervalSince1970WithoutDots(date: Date) -> String{
        return String(date.timeIntervalSince1970).replacingOccurrences(of: ".", with: "")
    }

}

1 个答案:

答案 0 :(得分:1)

日期距参考日期仅几秒钟(以Double表示)。 (这是“ TimeInterval”的别名,但这只是Double的一个。)

如果您希望它是一个字符串而又不丢失任何信息,那只是Double的字符串形式:

let nowString = "\(now.timeIntervalSinceReferenceDate)" // "595531191.461246"

然后将其转换回日期,将其转换回日期:

let originalDate = Date(timeIntervalSinceReferenceDate: TimeInterval(nowString)!)
originalDate == now // true

您绝对不想删除小数点。这是数字的重要组成部分。