如何根据时间字段(自 1970 年午夜以来的秒数)获取日期?
How to get the day based on a time field (seconds since midnight 1970)?
我正在从 api 获取数据,我得到的值之一是星期几,从 api 返回的数据如下所示:
"time": 1550376000
我创建了这个函数来获取日期:
func getDate(value: Int) -> String {
let date = Calendar.current.date(byAdding: .day, value: value, to: Date())
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "E"
return dateFormatter.string(from: date!)
}
但被告知有一种更安全的方法来获取它,而不是假设我们从今天开始连续几天。有谁知道如何从时间字段中构建日期(自 1970 年午夜以来的秒数),然后使用 Calendar 和 DateComponent 计算日期?
您可以使用 Calendar
从 Date
中获取日期组件:
let date = Date(timeIntervalSince1970: time)// time is your value 1550376000
let timeComponents = Calendar.current.dateComponents([.weekday, .day, .month, .year], from: date)
print("\(timeComponents.weekday) \(timeComponents.day!) \(timeComponents.month!) \(timeComponents.year!)") // print "7 16 2 2019"
print("\(\(Calendar.current.shortWeekdaySymbols[timeComponents.weekday!-1]))") // print "Sat"
希望对您有所帮助。
看起来您正在接收 json 数据,因此您应该构造数据并遵守 Decodable 协议,以将数据转换为结构正确的对象。
struct Object: Decodable {
let time: Date
}
不要忘记将解码器 dateDecodingStrategy
属性 设置为 secondsSince1970
do {
let obj = try decoder.decode(Object.self, from: Data(json.utf8))
let date = obj.time // "Feb 17, 2019 at 1:00 AM"
print(date.description(with: .current))// "Sunday, February 17, 2019 at 1:00:00 AM Brasilia Standard Time\n"
} catch {
print(error)
}
那么你只需要获取工作日组件(1...7 = Sun...Sat)并获取日历 shortWeekdaySymbols(本地化),从组件值中减去 1 并将其用作索引以获取相应的象征。我在 post 中使用相同的方法来获取完整的工作日名称:
extension Date {
var weekDay: Int {
return Calendar.current.component(.weekday, from: self)
}
var weekdaySymbolShort: String {
return Calendar.current.shortWeekdaySymbols[weekDay-1]
}
}
print(date.weekdaySymbolShort) // "Sun\n"
我正在从 api 获取数据,我得到的值之一是星期几,从 api 返回的数据如下所示:
"time": 1550376000
我创建了这个函数来获取日期:
func getDate(value: Int) -> String {
let date = Calendar.current.date(byAdding: .day, value: value, to: Date())
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "E"
return dateFormatter.string(from: date!)
}
但被告知有一种更安全的方法来获取它,而不是假设我们从今天开始连续几天。有谁知道如何从时间字段中构建日期(自 1970 年午夜以来的秒数),然后使用 Calendar 和 DateComponent 计算日期?
您可以使用 Calendar
从 Date
中获取日期组件:
let date = Date(timeIntervalSince1970: time)// time is your value 1550376000
let timeComponents = Calendar.current.dateComponents([.weekday, .day, .month, .year], from: date)
print("\(timeComponents.weekday) \(timeComponents.day!) \(timeComponents.month!) \(timeComponents.year!)") // print "7 16 2 2019"
print("\(\(Calendar.current.shortWeekdaySymbols[timeComponents.weekday!-1]))") // print "Sat"
希望对您有所帮助。
看起来您正在接收 json 数据,因此您应该构造数据并遵守 Decodable 协议,以将数据转换为结构正确的对象。
struct Object: Decodable {
let time: Date
}
不要忘记将解码器 dateDecodingStrategy
属性 设置为 secondsSince1970
do {
let obj = try decoder.decode(Object.self, from: Data(json.utf8))
let date = obj.time // "Feb 17, 2019 at 1:00 AM"
print(date.description(with: .current))// "Sunday, February 17, 2019 at 1:00:00 AM Brasilia Standard Time\n"
} catch {
print(error)
}
那么你只需要获取工作日组件(1...7 = Sun...Sat)并获取日历 shortWeekdaySymbols(本地化),从组件值中减去 1 并将其用作索引以获取相应的象征。我在 post
extension Date {
var weekDay: Int {
return Calendar.current.component(.weekday, from: self)
}
var weekdaySymbolShort: String {
return Calendar.current.shortWeekdaySymbols[weekDay-1]
}
}
print(date.weekdaySymbolShort) // "Sun\n"