如何从日期类型中获取日期和月份 - swift 4
Posted
技术标签:
【中文标题】如何从日期类型中获取日期和月份 - swift 4【英文标题】:How to get day and month from Date type - swift 4 【发布时间】:2018-11-17 23:05:32 【问题描述】:我有数据类型为 Date 的变量,我以这种格式存储了日期
2018-12-24 18:00:00 UTC
我怎样才能从这一天或这一月得到?
【问题讨论】:
Date components, date components, date components 搜索 SwiftDateFormatter()
和可能的 ISO8601DateFormatter()
。如果您只需要日期和月份,您可以删除日期值之后的所有内容并使用ISO8601DateFormatter
和这些格式选项[.withFullDate, .withDashSeparatorInDate]
几乎重复:***.com/questions/44040875/…
您说“我有数据类型为 Date 的变量,我以这种格式存储日期 2018-12-24 18:00:00 UTC
。”那没有意义。如果数据类型是 Date 它没有字符串格式。 Date
是一种基本类型,用于标识时间的瞬间。它没有格式。
如果您使用print(Date())
显示日期,您将获得类似2018-11-17 23:38:02 +0000
的输出(+0000
位是与 UTC 的偏移量。与 UTC 的偏移量为 0000 表示日期/时间为以 UTC 时区表示。)
【参考方案1】:
详情
Xcode 版本 11.0 (11A420a),Swift 5链接
How to convert string to Date
解决方案
extension Date
func get(_ components: Calendar.Component..., calendar: Calendar = Calendar.current) -> DateComponents
return calendar.dateComponents(Set(components), from: self)
func get(_ component: Calendar.Component, calendar: Calendar = Calendar.current) -> Int
return calendar.component(component, from: self)
用法
let date = Date()
// MARK: Way 1
let components = date.get(.day, .month, .year)
if let day = components.day, let month = components.month, let year = components.year
print("day: \(day), month: \(month), year: \(year)")
// MARK: Way 2
print("day: \(date.get(.day)), month: \(date.get(.month)), year: \(date.get(.year))")
【讨论】:
快速简便的解决方案【参考方案2】:是字符串还是日期类型?
如果是日期,您可以这样做:
let calendarDate = Calendar.current.dateComponents([.day, .year, .month], from: date)
这将为您提供日、年和月
【讨论】:
【参考方案3】:如果您将“2018-12-24 18:00:00 UTC”保存为字符串,您可以试试这个:
let dateString = "2018-12-24 18:00:00 UTC"
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss 'UTC'"
guard let date = formatter.date(from: dateString) else
return
formatter.dateFormat = "yyyy"
let year = formatter.string(from: date)
formatter.dateFormat = "MM"
let month = formatter.string(from: date)
formatter.dateFormat = "dd"
let day = formatter.string(from: date)
print(year, month, day) // 2018 12 24
祝你好运!
【讨论】:
【参考方案4】:日期字符串不符合 ISO8601,不过,如果您将 <space> + UTC
替换为 Z
并使用自定义格式选项,则可以使用 ISO8601DateFormatter
。
从字符串创建一个Date
并为day
和month
获取DateComponents
let string = "2018-12-24 18:00:00 UTC"
let formatter = ISO8601DateFormatter()
let trimmedString = string.replacingOccurrences(of: "\\s?UTC", with: "Z", options: .regularExpression)
formatter.formatOptions = [.withFullDate, .withFullTime, .withSpaceBetweenDateAndTime]
if let date = formatter.date(from: trimmedString)
let components = Calendar.current.dateComponents([.day, .month], from: date)
let day = components.day!
let month = components.month!
print(day, month)
【讨论】:
【参考方案5】:这就是我在 swift 4 中所做的。我有一个带有“billDate”的 Billing 类,其中包含一个包含日期的字段。
extension Billing:Identifiable
func month() -> String
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM"
if let inputDate = billDate
let month = dateFormatter.string(from: inputDate)
return month.uppercased()
return ""
【讨论】:
【参考方案6】:延期日期所有时间返回字符串:
extension Date
func dateDistance(_ startDate: Date = Date()) -> String
var remainingTime = ""
let dateValue = Calendar.current.dateComponents([.year,.month,.weekOfMonth,.day,.hour,.minute,.second], from: startDate, to: self)
remainingTime = String(format: "%2d Y - %2d M - %2d W - %2d D\n%02d:%02d:%02d",
dateValue.year ?? 0,
dateValue.month ?? 0,
dateValue.weekOfMonth ?? 0,
dateValue.day ?? 0,
dateValue.hour ?? 0,
dateValue.minute ?? 0,
dateValue.second ?? 0
)
return remainingTime
【讨论】:
以上是关于如何从日期类型中获取日期和月份 - swift 4的主要内容,如果未能解决你的问题,请参考以下文章
如何在iOS swift中实现带有月份、日期和时间的自定义选择器?