如何将此字符串“2016-04-14T10:44:00+0000”转换为NSDate并只保留年、月、日、小时?

中间的T真的让我在处理日期时不习惯。


当前回答

从iOS 15.0开始,我们可以更快速地将字符串转换为日期:

let strategy = Date.ParseStrategy(format: "\(year: .defaultDigits)-\(month: .twoDigits)-\(day: .twoDigits)T\(hour: .twoDigits(clock: .twentyFourHour, hourCycle: .zeroBased)):\(minute: .twoDigits):\(second: .twoDigits)\(timeZone: .iso8601(.short))", timeZone: .current)
let date = try? Date("2016-04-14T10:44:00+0000", strategy: strategy)

其他回答

斯威夫特5。看是否一个日期已经通过:

let expiryDate = "2020-01-10" // Jan 10 2020

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"

if Date() < dateFormatter.date(from: expiryDate) ?? Date() {
    print("Not Yet expiryDate")
} else {
    print("expiryDate has passed")
}

请使用ISO8601解析库来执行此操作。编码字符串的方法太多了。不要依赖于特定的格式,也不要依赖于始终发送相同的服务器。问题从末尾的“Z”开始,它将扩展到标准的所有品种。解析库将处理所有情况,并始终提供安全转换——而固定格式化字符串在将来可能会失败。

您可以使用这些库之一。CococaPods上也有:

https://github.com/boredzo/iso-8601-date-formatter/

https://github.com/malcommac/SwiftDate

看一下实现。它们都有几百行——这是有原因的。

关于这个问题:你可以使用NSDateComponents从日期中提取日期组件。网站上的例子正好符合你的情况。

https://developer.apple.com/documentation/foundation/nscalendar/1414841-components?language=objc

请注意,转换日期时会考虑到时区。你可能想显式地设置NSCalendar的locale。

斯威夫特5.6

这是一个简单的方法来获得一个字符串,并将其转换回字符串与日期的结构通过字符串扩展

日期字符串示例"2022-03-15T07:13:49.607+00:00"

如果日期的格式不是“yyyy-MM-dd'T hh:mm:ss”。SSSSSSSZ” 它将返回01-01-70

import Foundation

extension String {

  func convertToDate() -> String {
   
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ"
      if let dt = dateFormatter.date(from: self) {
          dateFormatter.dateFormat = "MM-dd-yy"
          let formatedStringDate = dateFormatter.string(from: dt)
              return formatedStringDate
      }
    
   
      return "01-01-70"
  }
}

Swift 3.0 - 4.2

import Foundation

extension String {

    func toDate(withFormat format: String = "yyyy-MM-dd HH:mm:ss")-> Date?{

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.calendar = Calendar(identifier: .gregorian)
        dateFormatter.dateFormat = format
        let date = dateFormatter.date(from: self)

        return date

    }
}

extension Date {

    func toString(withFormat format: String = "EEEE ، d MMMM yyyy") -> String {

        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "fa-IR")
        dateFormatter.timeZone = TimeZone(identifier: "Asia/Tehran")
        dateFormatter.calendar = Calendar(identifier: .persian)
        dateFormatter.dateFormat = format
        let str = dateFormatter.string(from: self)

        return str
    }
}

在Swift 4.1你可以做:

func getDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.locale = Locale.current
    return dateFormatter.date(from: "2015-04-01T11:42:00") // replace Date String
}