目标/问题
我想将Date
转换为String
,然后再转换回Date
。我能够做到这一点,但在途中我失去了精确度。如何确保在此过程中不会丢失单个 bit ?
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: "")
}
}
答案 0 :(得分:1)
日期距参考日期仅几秒钟(以Double表示)。 (这是“ TimeInterval”的别名,但这只是Double的一个。)
如果您希望它是一个字符串而又不丢失任何信息,那只是Double的字符串形式:
let nowString = "\(now.timeIntervalSinceReferenceDate)" // "595531191.461246"
然后将其转换回日期,将其转换回日期:
let originalDate = Date(timeIntervalSinceReferenceDate: TimeInterval(nowString)!)
originalDate == now // true
您绝对不想删除小数点。这是数字的重要组成部分。