【问题标题】:Convert string to DATE type in swift 3 [duplicate]在swift 3中将字符串转换为日期类型[重复]
【发布时间】:2017-01-03 03:06:44
【问题描述】:

我有这个结构:

struct message {

  var id: String = "0"
  var text: String = ""
  var date: Date!
  var status: String = "" 
}

我必须从 dbase 加载这个结构,它以String 格式导出,也以date 格式导出。 所以我写了这段代码来将String转换为Date类型:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
let dataDate = dateFormatter.date(from: elemMessage["date"] as! String)!

我将它加载到结构中:

message(id: elemMessage["id"] as! String, text: elemMessage["text"] as! String, date: dataDate as! Date, status: elemMessage["status"] as! String)

但我有这个警告:“从Date 转换为不相关的类型Date 总是失败”

因此,如果我运行应用程序,它将失败。

我该如何解决这个问题,结构中的 date var 必须是 Date 类型。

谢谢。

【问题讨论】:

  • 与问题无关,但是:您确定消息的空文本或状态有意义吗?似乎是一个非常不合理的默认值
  • 您显示的代码导致的错误与您的不同:错误:参数标签不正确。 (data: 必须是 date:?)请显示与导致问题的代码完全相同的代码。您还最好展示elemMessage 是如何声明的。这不是一个关键问题,但您最好使用 UpperCamelCase 作为类型名称。
  • 抱歉参数标签是date: 复制错误。 elemMessage 是来自 dbase 的 json 解析,它可以工作。我在date 上有错误
  • Swift 是一种类型推断语言。 var id = "0"
  • 你怎么知道你的日期是UTC?这种格式对我来说就像当地时间。如果是 UTC,那里会有一个 Z 或 +0000

标签: ios date swift3 xcode8


【解决方案1】:

您可以将字符串 Date 转换为 Date/NSDate,如下代码所示:-

Swift 3.2 & Swift 4.2

字符串到日期

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd-MM-yyyy" //Your date format
dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00") //Current time zone
//according to date format your date string
guard let date = dateFormatter.date(from: "01-01-2017") else {
    fatalError()
}
print(date) //Convert String to Date

日期转字符串

dateFormatter.dateFormat = "MMM d, yyyy" //Your New Date format as per requirement change it own
let newDate = dateFormatter.string(from: date) //pass Date here
print(newDate) //New formatted Date string

输出:-

2017-01-11 00:07:00 +0000
Jan 11, 2017

【讨论】:

  • 我使用了您的代码,但出现错误:` 无法转换类型为“日期”的值?到预期的参数类型“日期!” ` 当在结构消息中加载它时。
  • 注意您必须在 iOS 中缓存日期格式化程序:stackoverflow.com/a/42370648/294884
  • @Andand Nimje : 你有没有注意到,转换后一天递减
  • mm 不应该大写吗?
  • 不工作 ....转换为日期后日期不正确
【解决方案2】:

Swift 4 ISO

let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone.autoupdatingCurrent
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

【讨论】:

    【解决方案3】:
     func getDateFromString(dateStr: String) -> (date: Date?,conversion: Bool)
    {
        let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        let dateComponentArray = dateStr.components(separatedBy: "/")
    
        if dateComponentArray.count == 3 {
            var components = DateComponents()
            components.year = Int(dateComponentArray[2])
            components.month = Int(dateComponentArray[1])
            components.day = Int(dateComponentArray[0])
            components.timeZone = TimeZone(abbreviation: "GMT+0:00")
            guard let date = calendar.date(from: components) else {
                return (nil , false)
            }
    
            return (date,true)
        } else {
            return (nil,false)
        }
    
    }
    

    //输入:“23/02/2017”

    //输出:(2017-02-23 18:30:00 +0000, true)

    【讨论】:

    • 不安全的代码以及为什么在 Swift 类中使用 NS 类(NSCalendar、NSDateComponents)?
    • 感谢您的指出。请检查一下。