【问题标题】:How to get day and month from Date type - swift 4如何从日期类型中获取日期和月份 - swift 4
【发布时间】:2025-12-12 06:45:02
【问题描述】:

我有数据类型为 Date 的变量,我以这种格式存储了日期

2018-12-24 18:00:00 UTC

我怎样才能从这一天或这一月得到?

【问题讨论】:

  • 搜索 Swift DateFormatter() 和可能的 ISO8601DateFormatter()。如果您只需要日期和月份,您可以删除日期值之后的所有内容并使用ISO8601DateFormatter 和这些格式选项[.withFullDate, .withDashSeparatorInDate]
  • 您说“我有数据类型为 Date 的变量,我以这种格式存储日期 2018-12-24 18:00:00 UTC。”那没有意义。如果数据类型是 Date 它没有字符串格式。 Date 是一种基本类型,用于标识时间的瞬间。它没有格式。
  • 如果您使用print(Date()) 显示日期,您将获得类似2018-11-17 23:38:02 +0000 的输出(+0000 位是与 UTC 的偏移量。与 UTC 的偏移量为 0000 表示日期/时间为以 UTC 时区表示。)

标签: swift date


【解决方案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
          }
          }
          

          【讨论】: