ios - 快速转换日期而不会丢失
问题描述
目标/问题
我想将 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: "")
}
}
解决方案
Date 只是自参考日期以来的秒数,作为 Double。(这是“TimeInterval”的别名,但它只是一个 Double。)
如果你希望它是一个字符串而不丢失任何信息,那就是 Double 的字符串形式:
let nowString = "\(now.timeIntervalSinceReferenceDate)" // "595531191.461246"
并将其转换回来,将 Double 转换为 Date:
let originalDate = Date(timeIntervalSinceReferenceDate: TimeInterval(nowString)!)
originalDate == now // true
您绝对不想删除小数点。这是数字的重要组成部分。
推荐阅读
- c++ - Unknown Runtime When Using c++11 instead if c++14
- datetime - 如何在批处理文件中按日期时间创建文件夹
- jquery - this jquery validation prevent me to post form data, without this all is working fine
- python - 在 python 上使用 selenium 抓取动态网站
- c++ - const char* 常量数组
- maven - 无法将 Google Cloud Datastore 与 AEM 6.5 连接:Bundle 已解决依赖项
- typescript - 打字稿函数输出不能分配给条件类型
- php - laravel 8 模块表单错误此路由不支持 POST 方法。支持的方法:GET、HEAD
- c++ - 使用三元运算符从 cin 或文件中选择 istream
- r - 有没有办法运行多个 t.tests 产生的结果可以很容易地以表格格式存储?