首页 > 解决方案 > 快速转换日期而不会丢失

问题描述

目标/问题

我想将 a 转换Date为 aString并返回 a Date。我能够做到这一点,但我正在失去精确度。如何确保在此过程中不会丢失任何信息?

1573827905079978对比157382790508

主要代码

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: "")
    }

}

标签: iosswiftdate

解决方案


Date 只是自参考日期以来的秒数,作为 Double。(这是“TimeInterval”的别名,但它只是一个 Double。)

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

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

并将其转换回来,将 Double 转换为 Date:

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

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


推荐阅读