如何从日期类型中获取日期和月份 - 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 搜索 Swift DateFormatter() 和可能的 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 并为daymonth 获取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中实现带有月份、日期和时间的自定义选择器?

如何仅使用月份和日期从核心数据中获取

如何从列中删除日期和月份(类型:datetime64)[重复]

如何使用swift 3在iOS中隐藏上一个日期和月份?

如何根据日期列中的月份从 SQLite 中获取数据

如何获取当前月份的开始日期和结束日期